Appcrash при запуске UmfPackLU & lt; & gt; с собственной библиотекой

Я собираю и пытаюсь запустить 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<>> работает правильно.

Заранее благодарю за любую помощь.

1

Решение

Это недостаток в Eigen 3.2.9, который был исправлен некоторое время назад в ветке 3.3. Теперь это исправлено и в ветке 3.2 (changeset 1e7d97fea51d).

Вы можете обойти проблему, позвонив compute(...) вместо конструктора:

UmfPackLU<SparseMatrix<num_t>> solver;
solver.compute(A.transpose()*A);
1

Другие решения

Пожалуйста, не стесняйтесь исправлять / улучшать / устанавливать мой ответ.

Я обнаружил, что мне нужно создать ColMajor матрица AtA перед подачей в солвер (RowMajor не работает) следующим образом:

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

Это требование из-за Eigen«s lazy evaluation реализация для вызова external routine?

0

По вопросам рекламы [email protected]