2014-09-19 8 views
5

Ich habe eine Frage zur Eigen-Bibliothek in C++. Eigentlich möchte ich die inverse Matrix der Sparse-Matrix berechnen. Wenn ich die Dichte Matrix in Eigen verwendete, kann ich die Operation .inverse() verwenden, um die Inverse der dichten Matrix zu berechnen. Aber in der Sparse-Matrix kann ich nirgendwo eine umgekehrte Operation finden. Kennt jemand, der die Inverse der Sparse-Matrix berechnet? Hilf mir.Wie kann ich Inverse von Sparse-Matrix in Eigen-Bibliothek berechnen

+0

Fügen Sie ein paar mehr Tags, um möglicherweise umfassendere Antworten zu gewinnen. – Bathsheba

+0

Aha .. Danke, ich werde es versuchen – kujungmul

+0

Aber meine knappe Antwort steht! – Bathsheba

Antwort

7

Sie können es nicht direkt tun, aber Sie können es immer berechnen, indem Sie einen der sparse solvers verwenden. Die Idee ist zu lösen A*X=I, wo ich die Identitätsmatrix ist. Wenn es eine Lösung gibt, wird X Ihre inverse Matrix sein. The eigen documentation Seite über spärliche Löser hat und wie sie verwendet werden, aber die grundlegenden Schritte sind wie folgt:

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

Es ist nicht mathematisch sinnvoll.

Eine dünne Matrix muss nicht unbedingt eine spärliche Inverse haben.

Deshalb ist die Methode nicht verfügbar.

+0

Dies gilt auch für dichte Matrizen, mathematisch gibt es keinen Unterschied. Es ist mehr, dass es kostspielig ist, insbesondere wenn dünn besetzte Matrizen groß sind. – MatthiasB

0

Sie ein Beispiel über Inverse von Sparse komplexer Matrix

habe ich von SimplicialLLT Klasse finden,

können Sie andere Klasse finden von unten

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

Auf dieser Seite können Sie mit der richtigen Klassennamen für Ihre Arbeit (spead, Genauigkeit und dimmenssion Ihrer Matrix) helfen

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

Eine kleine Erweiterung auf @Soheib und @ MatthiasB die Antworten, wenn Sie Eigen::SparseMatrix<float> verwenden, es ist besser zu Verwenden Sie SparseLU anstelle von SimplizialLLT oder SimplizialLDLT, sie erzeugten falsche Antworten mit mir auf Float-Matrizen