将稀疏 mat-vec-mult 的结果存储到预分配的向量中
Store result of sparse mat-vec-mult into pre-allocated vector
我正在研究稀疏矩阵向量乘法的例程,并想使用 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 不应创建临时文件。
我正在研究稀疏矩阵向量乘法的例程,并想使用 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 不应创建临时文件。