我正在编译,并尝试在UMfPackLU<SparseMatrix<>>平台上使用Eigen 3.2.9UMFPACK v4.5TDM-GCC 5.1.0库运行Win64例程。但是我得到Appcrashexception 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);

10-08 20:05