我正在研究稀疏矩阵向量乘法的例程,并想使用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))
的内容。有没有办法做到这一点?
亲切的问候。
答案 0 :(得分:3)
尝试一下:
y.noalias() = A * x;
noalias()向Eigen表示不存在潜在的混叠问题(即y与x不重叠),并且Eigen不应创建临时别名。