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

时间:2019-01-14 15:31:14

标签: c++ eigen

我正在研究稀疏矩阵向量乘法的例程,并想使用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))的内容。有没有办法做到这一点?

亲切的问候。

1 个答案:

答案 0 :(得分:3)

尝试一下:

y.noalias() = A * x;

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