我正在编译,并尝试在UMfPackLU<SparseMatrix<>>
平台上使用Eigen 3.2.9
从UMFPACK v4.5
和TDM-GCC 5.1.0
库运行Win64
例程。但是我得到Appcrash
和exception code c0000005
。
我需要实现以下内容:
_ _ _ _
A = | P |, B = | R |, where P and Q are sparse and Z is 0 with 3 cols
| Q | | Z |
|_ _| |_ _|
X = A\B;
我正在做的事情(仅摘录)如下:
#define num_t double
...
SparseMatrix<num_t,RowMajor> A(P.rows()+Q.rows(), P.cols());
A.topRows(P.rows()) = P;
A.bottomRows(Q.rows()) = Q;
Matrix<num_t, Dynamic, 3> B(P.rows()+Q.rows(), 3);
B.topLeftCorner(P.rows(), 3) = R;
B.bottomLeftCorner(Q.rows(), 3) = S;
UmfPackLU<SparseMatrix<num_t>> solver(A.transpose()*A);
auto AtB = A.transpose()*B;
X.col(0) = solver.solve(AtB.col(0)); // @@@ segmentation error here @@@
X.col(1) = solver.solve(AtB.col(1));
X.col(2) = solver.solve(AtB.col(2));
注意
SparseMatrix<>
是RowMajor
格式。在使用
gdb
进行调试时:我在上面标记的行上获得了Program received signal SIGSEGV, Segmentation fault.
。用
UmfPackLU<SparseMatrix<>>
,SimplicialLLT<SparseMatrix<>>
或SimplicialLDLT<SparseMatrix<>>
求解可以代替CholmodDecomposition<SparseMatrix<>>
正常工作。在此先感谢您的帮助。
最佳答案
这是Eigen 3.2.9中的一个缺陷,该缺陷已在3.3分支中修复。现在,它也已在3.2分支中修复(更改集1e7d97fea51d)。
您可以通过调用compute(...)
而不是构造函数来解决此问题:
UmfPackLU<SparseMatrix<num_t>> solver;
solver.compute(A.transpose()*A);