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

如何在特征库中计算稀疏矩阵的逆 我在C++中有一个关于特征库的问题。实际上,我想计算稀疏矩阵的逆矩阵。 当我在Eigen中使用稠密矩阵时,我可以使用.inverse()运算来计算稠密矩阵的逆。 但在稀疏矩阵中,我在任何地方都找不到逆运算。有人知道计算稀疏矩阵的逆吗?帮帮我,c++,matrix,sparse-matrix,eigen,eigen3,C++,Matrix,Sparse Matrix,Eigen,Eigen3,这在数学上没有意义 稀疏矩阵不一定有稀疏逆矩阵 这就是该方法不可用的原因。您不能直接执行,但始终可以使用其中一个稀疏解算器进行计算。其思想是求解A*X=I,其中I是单位矩阵。如果有解,X将是你的逆矩阵。 有一个关于稀疏解算器以及如何使用它们的页面,但基本步骤如下: SolverClassName<SparseMatrix<double> > solver; solver.compute(A); SparseMatrix<double> I(n,n); I.se

这在数学上没有意义

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


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

您不能直接执行,但始终可以使用其中一个稀疏解算器进行计算。其思想是求解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);
SolverClassName解算器;
计算(A);
SparseMatrix I(n,n);
I.setIdentity();
自动A_inv=解算器解算(I);

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

我用的是SimplicialLLT类

你可以在贝娄找到其他的课程

此页面可以帮助您为您的工作提供正确的类名(矩阵的spead、准确性和Dimmension)

//以他的名义\\\\\\\\\\\\\\\\\\\\\\\\\\\
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间特征;
int main()
{
SparseMatrixA(4,4);

对于(int i=0;i是@Soheib和@MatthiasB答案的一个小扩展,如果你使用
Eigen::SparseMatrix
最好使用SparseLU,而不是SimplicialLLT或SimplicialLDLT,它们在浮点矩阵上产生了错误的答案,请注意,稀疏矩阵的逆不一定是稀疏的,因此如果你使用大型矩阵(如果使用稀疏表示,这可能会很昂贵)。请仔细考虑是否确实需要实际的矩阵逆。如果要使用矩阵逆解方程组,则不需要实际计算矩阵逆并将其相乘(使用通常命名为
solve
的方法,并提供等式的右侧).如果你需要费希尔矩阵的协方差的逆矩阵,试着近似。

加入更多的标签,以吸引可能更全面的答案。啊哈..谢谢你,我会尝试,但我简洁的答案是站得住脚的!为什么你需要显式的逆矩阵?这在计算和内存方面都非常昂贵,而且在数字上是不稳定的(除非你的矩阵几乎是幺正的)。如果你想计算A^1*B,那么就使用
SparseLU
的求解方法。这同样适用于稠密矩阵,数学上没有区别。这样做的代价更大,特别是当稀疏矩阵往往很大的时候。
//////////////////////   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_A\n" << inv_A << endl;
 }