Обратная матрица с SparseMatrix<.., RowMajor>

Я ищу способ получения инверсии SparseMatrix с использованием хранилища RowMajor с EIGEN 3.3.4. Там я нашел ответ на этот вопрос, но у меня возникли проблемы с его адаптацией к моему делу.

Данный способ сделать это с помощью Солвера и решить Ax=I (Я тождество), чтобы получить обратное А.

Что я не понимаю, так это следующее:

auto A_inv = solver.solve(I);

Похоже, в случае автора, результат solver.solve() это SparseMatrix объект. По моему это Solve объект, и именно поэтому у меня сейчас проблемы.

я использую SimplicialLDLT следующим образом:

SimplicialLDLT<SparseMatrix<short, RowMajor> solver;
solver.compute(A);
SparseMatrix<short,RowMajor> identity(A.rows(), A.cols()); identity.setIdentity();
auto result = solver.solve(identity);
std::cout<<"INVERSE MATRIX : "<<result<<std::endl;

Который не работает с result это Solve(Я думаю, что нет << перегрузки). То, что я ищу, это способ сделать:

SparseMatrix<short,RowMajor> matrix_result = result;

На данный момент результатом этого преобразования является ошибка: THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES,

Вопрос в следующем: как настроить решатель RowMajor и как получить результат этого в пригодной для использования матрице RowMajor?

Заранее спасибо.

С ColMajor

Использование ColMajor как для решателя, так и для rhs (lhs по-прежнему rowmajor, я не могу его изменить), результат неверный. Матрица А это:

A = 1 -1 0
    0  1 0
    0  0 1

Код является:

SparseMatrix<short,RowMajor> A;
//set A values
SparseMatrix<short,ColMajor> I(A.rows(),A.cols());I.setIdentity();
SimplicialLDLT<SparseMatrix<short,ColMajor>> solver;
solver.compute(A);
SparseMatrix<short,ColMajor> result = solver.solve(I);
std::cout<<result<<std::endl;

Отображение неправильного следующего:

1 0 0 
0 1 0
0 0 1

Где ожидаемый результат был:

1 1 0 
0 1 0
0 0 1

Я, наверное, что-то делаю не так, но не могу понять.

Решение: измените решатель на SparseLU, SimplicialLDLT работает только для симметричных матриц.

0 ответов

Другие вопросы по тегам