如何在特征库中计算稀疏矩阵的逆

How can I calculate inverse of sparse matrix in Eigen library

本文关键字:计算 特征      更新时间:2023-10-16

我有一个关于C++中的特征库的问题。实际上,我想计算稀疏矩阵的逆矩阵。当我在Eigen中使用稠密矩阵时,我可以使用inverse()运算来计算稠密矩阵的逆。但在稀疏矩阵中,我在任何地方都找不到逆运算。有人知道稀疏矩阵的逆运算吗?帮帮我。

您不能直接执行,但始终可以使用稀疏解算器进行计算。这个想法是求解A*X=I,其中I是单位矩阵。如果有一个解,X将是你的逆矩阵。特征文档有一个关于稀疏解算器以及如何使用它们的页面,但基本步骤如下:

SolverClassName<SparseMatrix<double> > solver;
solver.compute(A);
SparseMatrix<double> I(n,n);
I.setIdentity();
auto A_inv = solver.solve(I);

这在数学上没有意义。

稀疏矩阵不一定具有稀疏逆。

这就是该方法不可用的原因。

@Soheib和@MatthiasB答案的一个小扩展,如果你使用Eigen::SparseMatrix<float>,最好使用SparseLU,而不是SimplicialLLT或Simplicial LDLT,它们在浮点矩阵上产生了错误的答案

请注意,稀疏矩阵的逆并不一定是稀疏的,因此如果您使用的是大矩阵(如果您使用稀疏表示,则很可能是这样),那么这将是昂贵的。仔细考虑是否真的需要实际的矩阵逆。如果你要使用矩阵逆来求解方程组,那么你不需要实际计算矩阵逆并将其相乘(使用通常命名为solve的方法,并提供方程的右侧)。如果你需要费舍尔矩阵的倒数来计算协变量,试着近似。

您可以找到一个关于稀疏复矩阵逆的例子

我用过SimpliciaLLT类,

你可以在下面的中找到其他级别

http://eigen.tuxfamily.org/dox-devel/group__TopicSparseSystems.html

这个页面可以帮助你为你的工作提供正确的类名(你的矩阵的拼写、准确性和尺寸)

//////////////////////   In His Name  \\\\\\\\\\\\\
#include <iostream>
#include <vector>
#include <Eigen/Dense>
#include <Eigen/Sparse>
using namespace std;
using namespace Eigen;
int main()
 {
    SparseMatrix< complex<float> > A(4,4);
    for (int i=0; i<4; i++) {
      for (int j=0; j<4; j++) {
         A.coeffRef(i, i) = i+j;
      }
   }
  A.insert(2,1) = {2,1};
  A.insert(3,0) = {0,0};
  A.insert(3,1) = {2.5,1};
  A.insert(1,3) = {2.5,1};
   SimplicialLLT<SparseMatrix<complex<float> > > solverA;
   A.makeCompressed();
   solverA.compute(A);
   if(solverA.info()!=Success) {
     cout << "Oh: Very bad" << endl;
   }
   SparseMatrix<float> eye(4,4);
   eye.setIdentity();
   SparseMatrix<complex<float> > inv_A = solverA.solve(eye);
   cout << "A:n" << A << endl;
   cout << "inv_An" << inv_A << endl;
 }