0

我正在寻找一种方法来使用带有 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;

哪个不起作用,因为resultSolve(我想没有<<过载)。我正在寻找的是一种方法:

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 仅适用于对称矩阵。

4

0 回答 0