【问题标题】:UMFPACK and BOOST's uBLAS Sparse MatrixUMFPACK 和 BOOST 的 uBLAS 稀疏矩阵
【发布时间】:2010-10-21 15:26:04
【问题描述】:

我在数字代码中使用 Boost 的 uBLAS,并且有一个“重型”求解器:

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

代码运行良好,但是速度非常慢。经过一番研究,我找到了UMFPACK,这是一个稀疏矩阵求解器(除其他外)。我的代码生成大型稀疏矩阵,我需要非常频繁地求逆(更正确地解决,逆矩阵的值无关紧要),因此 UMFPAck 和 BOOST 的 Sparse_Matrix 类似乎是幸福的婚姻。

UMFPACK 要求由三个向量指定的稀疏矩阵:条目计数、行索引和条目。 (See example)。

我的问题归结为,我可以从 BOOST 的稀疏矩阵类中有效地获取这三个向量吗?

【问题讨论】:

    标签: c++ boost linear-algebra numerical umfpack


    【解决方案1】:

    对此有一个绑定:

    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

    【讨论】:

    • 这是我最终使用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多