2014-09-19 4 views
5

У меня вопрос о библиотеке Eigen в C++. На самом деле, я хочу рассчитать инверсную матрицу разреженной матрицы. Когда я использовал Dense-матрицу в Eigen, я могу использовать операцию .inverse() для вычисления инверсии плотной матрицы. Но в разреженной матрице я нигде не могу найти обратную операцию. Кто-нибудь, кто знает, чтобы вычислить инверсию разреженной матрицы? Помоги мне.Как рассчитать инверсию разреженной матрицы в Eigen-библиотеке

+0

Поместите еще несколько тегов, чтобы привлечь, возможно, более полные ответы. – Bathsheba

+0

Ага .. Спасибо Я попробую – kujungmul

+0

Но мой кроткий ответ действительно стоит! – Bathsheba

ответ

7

Вы не можете сделать это напрямую, но вы всегда можете рассчитать его, используя один из разреженных решателей. Идея состоит в том, чтобы решить A*X=I, где 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); 
2

Это не математически значимый.

Редкая матрица необязательно имеет разреженный инверсный характер.

Вот почему метод недоступен.

+0

Это справедливо и для плотных матриц, математически нет разницы. Более того, это дорого стоить, тем более, что разреженные матрицы, как правило, большие. – MatthiasB

0

Вы можете найти пример о обратном разреженной комплексной матрице

я использовал класс SimplicialLLT,

вы можете найти другой класс из сильфона

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

Эта страница может помочь вам с правильным именем класса для вашей работы (spead, точность и dimmenssion вашей матрицы)

////////////////////// 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

Небольшое расширение на @Soheib и @ ответы MatthiasB, в если вы используете Eigen::SparseMatrix<float> это лучше используйте SparseLU, а не SimplicialLLT или SimplicialLDLT, они произвели неправильные ответы со мной на поплавковых матрицах

Смежные вопросы