Я собираю и пытаюсь запустить 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 (changeset 1e7d97fea51d).
Вы можете обойти проблему, позвонив compute(...)
вместо конструктора:
UmfPackLU<SparseMatrix<num_t>> solver;
solver.compute(A.transpose()*A);
Пожалуйста, не стесняйтесь исправлять / улучшать / устанавливать мой ответ.
Я обнаружил, что мне нужно создать ColMajor
матрица AtA
перед подачей в солвер (RowMajor
не работает) следующим образом:
SparseMatrix<num_t, ColMajor> AtA = A.transpose()*A;
UmfPackLU<SparseMatrix<num_t>> solver(AtA);
Это требование из-за Eigen
«s lazy evaluation
реализация для вызова external routine
?