4


4

UMFPACKおよびBOOSTのuBLASスパースマトリックス

BoostのuBLASを数値コードで使用しており、「ヘビー」ソルバーを配置しています。

コードは非常にうまく機能しますが、非常に遅いです。 いくつかの調査の後、http://www.cise.ufl.edu/research/sparse/umfpack/ [UMFPACK]を見つけました。これは、スパースマトリックスソルバーです(他のものもあります)。 私のコードは非常に頻繁に反転する必要がある大きなスパース行列を生成します(より正確に解くと、逆行列の値は無関係です)ので、UMFPACkとBOOSTのSparse_Matrixクラスは幸せな結婚のようです。

UMFPACKは、エントリカウント、行インデックス、エントリの3つのベクトルで指定されたスパース行列を要求します。 (http://www.math.umbc.edu/~rouben/2003-09-math625/umfpack-ex1.c [例を参照])。

私の質問をまとめると、これら3つのベクトルをBOOSTのスパースマトリックスクラスから効率的に取得できますか?

1 Answer


6


これにはバインディングがあります:

このプロジェクトは2年停滞しているように見えますが、うまく機能しています。 使用例

    #include
    #include
    #include
    #include
    #include

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

    int main() {

      ublas::compressed_matrix, ublas::unbounded_array > A (5,5,12);
      ublas::vector 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 Symbolic;
      umf::numeric_type 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への移行を検討しています