2017-05-18 1 views
-1

Je veux résoudre un système linéaire clairsemés comme celui-ci:eigen erreur: SelfAdjointView est que pour les matrices carrées

SparseMatrix<double> A(m, n); 
VectorXd b(m); 
ConjugateGradient<SparseMatrix<double>, Upper> solver; 
solver.compute(A); 
VectorXd X = solver.solve(b); 

mais j'eu cette erreur pour exécuter ce code:

Assertion failed: (rows()==cols() && "SelfAdjointView is only for squared matrices"), function SparseSelfAdjointView

pourquoi je suis ce problème et comment le résoudre?


J'écris un petit exemple pour reproduire cette erreur:

#include "lib/Eigen/Sparse" 

using namespace Eigen; 

int main() 
{ 
    SparseMatrix<double> A(2, 3); 

    A.coeffRef(0, 0) = 1; 
    A.coeffRef(0, 1) = 1; 
    A.coeffRef(0, 2) = 1; 
    A.coeffRef(1, 0) = 1; 
    A.coeffRef(1, 1) = 1; 
    A.coeffRef(1, 2) = 1; 

    VectorXd b(2); 
    b << 3, 3; 

    ConjugateGradient<SparseMatrix<double>, Upper> solver; 
    solver.compute(A); 
    VectorXd X = solver.solve(b); 

    return 0; 
} 

Répondre

1

L'algorithme ConjugateGradient fonctionne uniquement avec des matrices autoadjoints. Pour les matrices rectangulaires, utilisez LeastSquaresConjugateGradient à la place.