我正在寻找一种方法,使用带有EIGEN 3.3.4的RowMajor存储来检索SparseMatrix的反转。我找到了这个问题的答案there,但我遇到了适应我的问题的问题。
执行此操作的方法是使用求解器,并解析Ax=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矩阵中检索此结果?
提前致谢。
对求解器和rhs使用ColMajor(lhs仍然是主流,我无法改变它),结果是错误的。矩阵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仅适用于对称矩阵。