我正在尝试乘以子矩阵,例如Eigen :: SparseMatrix的块,列和行。但是,每当涉及到多个子矩阵时,我的程序就会崩溃(以及gdb崩溃)。我正在使用本征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的昂贵构造(
m
和d
>> 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(或更高版本)
关于c++ - 特征根中的稀疏子矩阵相乘,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40267155/