圧縮された行形式でスパース行列クラスを実装しています。これは、行の数が固定されており、各行がいくつかの要素で構成されていることを意味します(この数は行ごとに異なる可能性がありますが、マトリックスが初期化された後は変更されません。
ベクトルのベクトルを介してこれを実装するのは適切ですか、それともこれはどういうわけかメモリを断片化しますか?
これの割り当てをどのように実装すれば、1つの大きなメモリチャンクができますか?
あなたの知恵を共有してくれてありがとう!ダーク
圧縮された行形式でスパース行列クラスを実装しています。これは、行の数が固定されており、各行がいくつかの要素で構成されていることを意味します(この数は行ごとに異なる可能性がありますが、マトリックスが初期化された後は変更されません。
ベクトルのベクトルを介してこれを実装するのは適切ですか、それともこれはどういうわけかメモリを断片化しますか?
これの割り当てをどのように実装すれば、1つの大きなメモリチャンクができますか?
あなたの知恵を共有してくれてありがとう!ダーク
Boostスパース行列(http://www.boost.org/doc/libs/1_43_0/libs/numeric/ublas/doc/matrix_sparse.htm)などの既存のライブラリを使用できます。
I've implemented the compressed column format with 3 std::vector<int>
(2 for row & column indices and one for the value). Why do you need std::vector<std::vector<int>>
?
Are you sure you're implementing the right format? A description of the compressed column format (and code for matrix-vector multiplication) can be found here.
vector-of-vectorsでは「1つの大きなチャンク」は得られません。各行は連続したチャンクになりますが、各行のデータはヒープ上の異なる場所に配置される可能性があります。
巨大な行列を扱う場合、これは良いことかもしれないことを覚えておいてください。マトリックスが大きいほど、全体に適合する連続したチャンクを取得できる可能性が低くなります。
スパース行列の一般的な規則は、行列内の非ゼロの位置に最適な構造を選択することです。したがって、マトリックス構造について、またどの(種類の)アルゴリズムが呼び出されるかについて、もう少し詳しく説明することができます。
メモリについて-この行列が大きすぎない場合は、1つの大きなチャンクとして割り当て、インデックスマジックを作成することをお勧めします。これにより、キャッシュの使用が改善される可能性があります。巨大な場合は、メモリに収まるため、チャンクバージョンを使用する必要があります。