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

时间:2014-09-19 08:14:32

标签: c++ matrix sparse-matrix eigen eigen3

我对C ++中的Eigen库有疑问。实际上,我想计算稀疏矩阵的逆矩阵。 当我在Eigen中使用Dense矩阵时,我可以使用.inverse()运算来计算密集矩阵的逆。 但是在稀疏矩阵中,我无法在任何地方找到逆运算。有谁知道计算稀疏矩阵的逆?帮我。

5 个答案:

答案 0 :(得分:9)

您无法直接执行此操作,但您始终可以使用其中一个稀疏解算器进行计算。我的想法是解决A*X=I,其中我是单位矩阵。如果有解,X将是你的逆矩阵。 The eigen documentation有一个关于稀疏求解器以及如何使用它们的页面,但基本步骤如下:

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

答案 1 :(得分:1)

它在数学上没有意义。

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

这就是为什么这个方法不可用的原因。

答案 2 :(得分:0)

您可以找到有关稀疏复杂矩阵的逆的示例

我使用的是SimplicialLLT类,

你可以找到bellow的其他课程

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_A\n" << inv_A << endl;
 }

答案 3 :(得分:0)

@Soheib和@MatthiasB的答案的小扩展,如果您使用jest.mock('react-native-google-analytics-bridge'); import {GoogleAnalyticsTracker} from 'react-native-google-analytics-bridge'; describe('testing mocking', () => { it ('should return undefined when mocked', () => { let tracker2 = new GoogleAnalyticsTracker(null); expect(tracker2).toBe(undefined); }) }) 使用SparseLU而不是SimplicialLLT或SimplicialLDLT更好,他们会产生错误的答案我在浮动矩阵上

答案 4 :(得分:0)

请注意,稀疏矩阵的逆不一定是稀疏矩阵,因此如果您正在处理大型矩阵(如果您使用稀疏表示,这很可能)那么这将是昂贵的。仔细考虑您是否真的需要实际的逆矩阵。如果您打算使用逆矩阵来求解方程组,那么您不需要实际计算逆矩阵并将其相乘(使用通常名为 solve 的方法并提供右手-方程的一边)。如果您需要 Fisher 矩阵的逆求协方差,请尝试近似。