簡體   English   中英

如何計算特征庫中稀疏矩陣的逆

[英]How can I calculate inverse of sparse matrix in Eigen library

我有一個關於 C++ 中的 Eigen 庫的問題。 實際上,我想計算稀疏矩陣的逆矩陣。 當我在 Eigen 中使用密集矩陣時,我可以使用 .inverse() 操作來計算密集矩陣的逆。 但是在稀疏矩陣中,我在任何地方都找不到逆運算。 有誰知道計算稀疏矩陣的逆? 幫我。

您不能直接執行此操作,但您始終可以使用其中一種稀疏求解器進行計算。 這個想法是解決A*X=I ,其中 I 是單位矩陣。 如果有解,X 將是你的逆矩陣。 eigen 文檔有一個關於稀疏求解器及其使用方法的頁面,但基本步驟如下:

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

它在數學上沒有意義。

稀疏矩陣不一定有稀疏逆矩陣。

這就是該方法不可用的原因。

你可以找到一個關於 Sparse Complex Matrix 逆的例子

我使用了 SimplicialLLT 類,

你可以從下面找到其他課程

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;
 }

@Soheib 和 @MatthiasB 答案的一個小擴展,如果你使用Eigen::SparseMatrix<float>最好使用 SparseLU 而不是 SimplicialLLT 或 SimplicialLDLT,他們在浮點矩陣上給我錯誤的答案

請注意,稀疏矩陣的逆不一定是稀疏矩陣,因此如果您正在使用大型矩陣(如果您使用稀疏表示,這很可能)那么這將是昂貴的。 仔細考慮您是否真的需要實際的逆矩陣。 如果您打算使用逆矩陣來求解方程組,那么您不需要實際計算逆矩陣並將其相乘(使用通常稱為solve的方法並提供方程)。 如果您需要 Fisher 矩陣的逆求協方差,請嘗試近似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM