2010-10-21 133 views
4

我使用Boost的uBLAS庫中的數字代碼,並有一個「重」求解到位:UMFPACK和BOOST的uBLAS庫稀疏矩陣

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

代碼工作很好,但是,它是痛苦的緩慢。經過一番研究,我發現了UMFPACK,這是一個稀疏矩陣求解器(等等)。我的代碼生成大型稀疏矩陣,我需要非常頻繁地進行反轉(更正確地說,逆矩陣的值是無關緊要的),所以UMFPACk和BOOST的Sparse_Matrix類似乎是一個美滿的婚姻。

UMFPACK要求由三個向量指定的稀疏矩陣:入口計數,行索引和條目。 (See example)。

我的問題歸結爲,我可以從BOOST的稀疏矩陣類有效地獲得這三個向量嗎?

回答

6

有這個綁定:

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

該項目似乎兩年停滯不前,但它的工作好。一個例子使用:

#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) 
    } 

注意

雖然這工作,我正在考慮搬到NETLIB

+0

這是我最終使用。 – ccook 2010-11-12 12:04:34