1

我正在编译并尝试在平台上运行UMfPackLU<SparseMatrix<>>例程Eigen 3.2.9UMFPACK v4.5库。但我正在接受。TDM-GCC 5.1.0Win64Appcrashexception 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<>>工作正常。

提前感谢您的帮助。

4

2 回答 2

1

这是 Eigen 3.2.9 中的一个缺点,不久前已在 3.3 分支中修复。它现在也已在 3.2 分支中修复(变更集 1e7d97fea51d)。

compute(...)您可以通过调用而不是构造函数来解决此问题:

UmfPackLU<SparseMatrix<num_t>> solver;
solver.compute(A.transpose()*A);
于 2016-08-03T15:53:22.867 回答
0

请随时纠正/增强/建立我的答案。

我发现,我需要先实例化一个显式ColMajor矩阵AtA,然后再将其提供给求解器(RowMajor不起作用),如下所示:

SparseMatrix<num_t, ColMajor> AtA = A.transpose()*A;
UmfPackLU<SparseMatrix<num_t>> solver(AtA);

这是由于调用Eigenlazy evaluation实现而需要的external routine吗?

于 2016-08-03T09:08:16.727 回答