Обратная матрица с 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 работает только для симметричных матриц.