c-将稀疏mat-vec-mult的结果存储到预分配的向量中

我正在研究稀疏矩阵向量乘法的例程,并希望使用Eigen3库创建参考性能基准.我只想对实际算术进行基准测试,而结果向量的构造中不涉及内存分配.如何做到这一点?

我试图将结果分配给一个预先分配的向量,但是Eigen :: internal :: set_is_malloc_allowed揭示了尽管进行了所有尝试,但仍执行了一些内存分配.

// Setup multiplicands
const Eigen::SparseMatrix<double, Eigen::RowMajor> A = createMat();
const Eigen::VectorXd x = Eigen::VectorXd::Random(num_of_cols);
// Pre-allocate result vector
Eigen::VectorXd y = Eigen::VectorXd::Zero(num_of_rows);

Eigen::internal::set_is_malloc_allowed(false);
y = A * x; // <-- Runtime-error in debug mode
Eigen::internal::set_is_malloc_allowed(true);

我正在寻找的基本上是稀疏矩阵矢量乘法的一种形式,它引用了将结果写入其中的输出缓冲区.而不是上面的示例中的y = A * x,然后编写类似于matVecMult(A,x,std :: begin(y))的代码.有没有办法做到这一点?

亲切的问候.

最佳答案
尝试这个:

y.noalias()= A * x;

noalias()向Eigen指示不存在潜在的混叠问题(即y与x不重叠),并且Eigen不应创建临时项.

转载注明原文:c-将稀疏mat-vec-mult的结果存储到预分配的向量中 - 代码日志