8

C++ の Eigen ライブラリについて質問があります。実は、疎行列の逆行列を計算したいのです。Eigen で密行列を使用した場合、.inverse() 操作を使用して密行列の逆を計算できます。しかし、スパース行列では、逆演算はどこにも見つかりません。疎行列の逆を計算することを知っている人はいますか? 助けて。

4

5 に答える 5

1

数学的に意味がありません。

スパース行列は必ずしもスパース逆行列を持つとは限りません。

そのため、メソッドは使用できません。

于 2014-09-19T08:22:32.587 に答える
0

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;
 }
于 2015-02-17T17:21:51.023 に答える
0

@Soheib と @MatthiasB の回答の小さな拡張です。使用している場合Eigen::SparseMatrix<float>は、SimplicialLLT や SimplicialLDLT ではなく SparseLU を使用することをお勧めします。フロート行列で間違った回答が得られました

于 2016-12-06T17:58:33.097 に答える