在 Eigen 中乘以稀疏子矩阵

Multiplying sparse sub-matrices in Eigen

我正在尝试乘以 Eigen::SparseMatrix 的块、列和行等子矩阵。但是,只要涉及多个子矩阵,我的程序就会崩溃(gdb 也会崩溃)。我正在使用 Eigen 3.2.1。

举个例子:

const unsigned m = 3, d = 1;
SparseMatrix<double> H(3*m,3*m);
H.setIdentity();
SparseMatrix<double> G(m,d);
G.coeffRef(0,0) = 1;

// this works
SparseMatrix<double> H_00 = H.block(0,0,m,m);
double val = SparseMatrix<double>(G.col(0).transpose() * H_00 * G.col(0)).coeffRef(0,0);

// this crashes
val = SparseMatrix<double>(G.col(0).transpose() * H.block(0,0,m,m) * G.col(0)).coeffRef(0,0);

有没有办法避免 H_00 的昂贵(md >> 1000)构造?

我检查了 Eigen 的 3.2.1 版本,这似乎与这个 Eigen 错误有关: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=875

发生的事情是在内部递归调用了一个函数(名为SparseMatrixBase::nonZeros()) 不幸的是,这在 3.2 分支中没有得到正确修复(对于 3.2.10 版本,您的示例无法编译)。它确实适用于最新的 Eigen 3.3 版本,但是(目前为 3.3rc1)——这回答了你的问题:是的,升级到 Eigen 3.3rc1(或更新版本)