我正在寻找一种方法来使用带有 EIGEN 3.3.4 的 RowMajor 存储来检索 SparseMatrix 的逆。我在那里找到了这个问题的答案,但我在适应我的情况时遇到了问题。
给定的方法是使用求解器和解析Ax=I
(I 是身份)来检索 A 的逆。
我不明白的是:
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
对求解器和 rhs 使用 ColMajor(lhs 仍然是 rowmajor,我无法更改),结果是错误的。矩阵 A 是:
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 仅适用于对称矩阵。