如何将稀疏矩阵和稠密向量相乘?

Mak*_*gan 2 c++ math matrix eigen

我正在尝试以下操作:

Eigen::SparseMatrix<double> bijection(2 * face_count, 2 * vert_count);
/* initialization */
Eigen::VectorXd toggles(2 * vert_count);
toggles.setOnes();
Eigen::SparseMatrix<double> deformed;
deformed = bijection * toggles;
Run Code Online (Sandbox Code Playgroud)

Eigen 返回一个错误,声称:

 error: static assertion failed: THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS
  586 |       EIGEN_STATIC_ASSERT((internal::is_same<Dest,void>::value),THE_EVAL_EVALTO_FUNCTION_SHOULD_NEVER_BE_CALLED_FOR_DENSE_OBJECTS);
Run Code Online (Sandbox Code Playgroud)

根据本征文件

允许稀疏矩阵和向量积。我究竟做错了什么?

jwe*_*rek 5

问题是您的产品输出类型错误。

Eigen 文档指出定义了以下类型的乘法:

dv2 = sm1 * dv1;

稀疏矩阵乘以稠密向量等于稠密向量。

如果您确实需要稀疏表示,我认为没有比执行上述乘法然后使用成员函数将乘积转换为稀疏矩阵更好的方法了sparseView。例如

Eigen::SparseMatrix<double> bijection(2 * face_count, 2 * vert_count);
/* initialization */
Eigen::VectorXd toggles(2 * vert_count);
toggles.setOnes();
Eigen::VectorXd deformedDense = bijection * toggles;
Eigen::SparseMatrix<double> deformedSparse = deformedDense.sparseView();
Run Code Online (Sandbox Code Playgroud)