1

次の形式でデータを読み込むプログラムがあります。

Row    Column    Value
1      1         4
1      3         5
2      1         6
...

ここで、最初の 2 列は行列のインデックスを参照し、値列には行列のその (行、列) 座標に格納された値が含まれます。

行列を表すために実際に 2 次元配列を作成する場合、入力データが非常にまばらであるため、非常に大きくなります。代わりに、(行、列) ペアに対応する値を検索し、存在しない場合は 0 を返すことができる疎行列表現を作成したいと考えています。

ブーストにはこれを行う方法があるようですが、実際にその使用方法を理解するのに十分なドキュメントが見つかりません。

これらを詳しく読みましたが、続行する方法がまだわかりません。

http://www.guwi17.de/ublas/doc/html/ex__fill1_8cpp-source.html http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/matrix_sparse.htm

私は C++ の初心者なので、ブーストを使用して入力データからスパース行列を作成する方法がわかりません (既に読み込んでいると仮定します)。また、ブースト疎行列を使用して (行、列) ペアに関連する値を実際に返す方法を見つけ出すこともできません。誰かがいくつかの基本的な例を教えてくれますか、またはこれを行う方法を説明できますか?

ご協力いただきありがとうございます。

4

1 に答える 1

9

mapped_matrixブーストにはいくつかの種類の疎行列の実装がありstd::mapます。使い方はどれも同じです。compressed_matrixcoordinate_matrix

圧縮行列の基本は次のとおりです。

#include <iostream>
#include <sstream>
#include <boost/numeric/ublas/matrix_sparse.hpp>

namespace ublas = boost::numeric::ublas;
int main()
{
    ublas::compressed_matrix<int> m(10, 10); // 10x10 compressed matrix

    // replace by ifstream in("filename") in real code
    std::istringstream in("1      1         4\n"
                          "1      3         5\n"
                          "2      1         6\n");

    // read from stream
    int val;
    for(size_t r,c; in >> r >> c >> val; )
        m(r,c) = val;

    // print out
    for(size_t i = 0; i < m.size1(); ++i)
    {
        for(size_t j = 0; j < m.size2(); ++j)
             std::cout << m(i,j) << ' ';
        std::cout << '\n';
    }

    // info on the storage
    std::cout << "Non-zeroes: " << m.nnz() << '\n'
              << "Allocated storage for " << m.nnz_capacity() << '\n';

}

オンライン デモ: http://liveworkspace.org/code/2iCZuF

于 2013-03-20T05:06:43.117 に答える