在Eigen中乘以稀疏子矩阵

时间:2016-10-26 16:07:25

标签: c++ sparse-matrix 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);

有没有办法避免昂贵的(md&gt;&gt; 1000)H_00的构建?

1 个答案:

答案 0 :(得分:0)

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

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