具有SparseMatrix的逆矩阵< ..,RowMajor>

时间:2018-01-22 15:59:48

标签: sparse-matrix eigen solver eigen3 row-major-order

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

这不起作用,因为resultSolve(我猜没有<<重载)。我正在寻找的是一种方法:

SparseMatrix<short,RowMajor> matrix_result = result;

目前,此次转化的结果是错误:THIS_METHOD_IS_ONLY_FOR_COLUMN_MAJOR_MATRICES

问题是:如何设置RowMajor解算器,以及如何在可用的RowMajor矩阵中检索此结果

提前致谢。

使用ColMajor

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

0 个答案:

没有答案