2010-10-21 5 views
4

J'utilise les uBLAS de Boost dans un code numérique et ont un 'lourd' solveur en place:UMFPACK et uBLAS Sparse de BOOST Matrice

http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?LU_Matrix_Inversion

Le code fonctionne très bien, cependant, il est très lent. Après quelques recherches, j'ai trouvé UMFPACK, qui est un solveur de matrice clairsemée (entre autres choses). Mon code génère de grandes matrices creuses que j'ai besoin d'inverser très fréquemment (résoudre plus correctement, la valeur de la matrice inverse n'est pas pertinente), donc la classe Sparse_Matrix de UMFPACk et BOOST semble être un mariage heureux. UMFPACK demande la matrice creuse spécifiée par trois vecteurs: un nombre d'entrées, des index de ligne et les entrées. (See example).

Ma question se résume à, puis-je obtenir ces trois vecteurs efficacement de la classe Sparse Matrix de BOOST?

Répondre

6

Il y a une liaison pour ceci:

http://mathema.tician.de/software/boost-numeric-bindings

Le projet semble être deux ans stagnante, mais il fait bien le travail. Un exemple d'utilisation:

#include <iostream> 
    #include <boost/numeric/bindings/traits/ublas_vector.hpp> 
    #include <boost/numeric/bindings/traits/ublas_sparse.hpp> 
    #include <boost/numeric/bindings/umfpack/umfpack.hpp> 
    #include <boost/numeric/ublas/io.hpp> 

    namespace ublas = boost::numeric::ublas; 
    namespace umf = boost::numeric::bindings::umfpack; 

    int main() { 

     ublas::compressed_matrix<double, ublas::column_major, 0, 
     ublas::unbounded_array<int>, ublas::unbounded_array<double> > A (5,5,12); 
     ublas::vector<double> B (5), X (5); 

     A(0,0) = 2.; A(0,1) = 3; 
     A(1,0) = 3.; A(1,2) = 4.; A(1,4) = 6; 
     A(2,1) = -1.; A(2,2) = -3.; A(2,3) = 2.; 
     A(3,2) = 1.; 
     A(4,1) = 4.; A(4,2) = 2.; A(4,4) = 1.; 

     B(0) = 8.; B(1) = 45.; B(2) = -3.; B(3) = 3.; B(4) = 19.; 

     umf::symbolic_type<double> Symbolic; 
     umf::numeric_type<double> Numeric; 

     umf::symbolic (A, Symbolic); 
     umf::numeric (A, Symbolic, Numeric); 
     umf::solve (A, X, B, Numeric); 

     std::cout << X << std::endl; // output: [5](1,2,3,4,5) 
    } 

NOTE:

Bien que ce travail, j'envisage de passer à NETLIB

+0

Voilà ce que je fini par utiliser. – ccook

Questions connexes