0

Linux で巨大な疎行列を効率的に計算するための C/C++ インターフェイスを探しています。マトリックスは、数百万×数千/数千になる可能性があります。いくつかの既存のライブラリを確認しましたが、私の要件をすべて満たすものはないようです。

1、要素を動的に追加して疎行列を作成する必要があります。(SparseLib++ ではありません)

2、別の疎行列の列を異なるスカラーでスケーリングできるように、疎対角行列を作成できる必要もあります。(このためのライブラリが見つかりませんでした。また、疎行列を列ごとにスケーリングする別の方法があるかもしれません)

3、行列/ベクトルで乗算された行列の操作をサポートする必要があります(多くのライブラリがこれらの基本的な操作をサポートしています)

4、MATLAB の .* や ./ のように、2 つのスパース行列またはベクトル間のエントリごとの乗算または除算をサポートする必要があります (このためのライブラリが見つかりませんでした。1 つのスパースのいくつかのエントリを選別するためにこの操作が必要です)行列と別の疎行列)

5、マトリックス反転または線形ソルバー。(ほとんどのライブラリは、線形システムのソルバーを提供します)

私は元々、アルゴリズムを実装するために Python で scipy を使用していました。Python はメモリを消費しすぎて遅いので、プログラムを C に変換したいと考えています。

ありがとう。

4

5 に答える 5

3

Tim Davis による CSparse をお勧めします。

更新 (2019): Tim Davis はその後SuiteSparseをリリースしました。これは、マトリックスを段階的に構築する機能を含め、投稿に記載されているすべての要件を満たしています ( RedisGraph プレゼンテーションのスライド 34またはSuiteSparse:GraphBLAS ペーパーの「3.1.8 ノンブロッキング モード」を参照)。

于 2010-12-10T22:21:20.657 に答える
1

LinBoxを見たことがありますか?いくつかのスパース行列ストレージ形式をサポートしており、そのうちのいくつかでは、行列の作成後にエントリを設定できます。

// set m[i,j] to a
m.refEntry(i, j) = a;

4.要件がすぐに満たされるかどうかはわかりませんが、このrefEntryメソッドを使用して簡単にコーディングできます。

于 2010-12-13T21:42:52.833 に答える
1

残念ながら、ほとんどのスパース行列ライブラリは、要素を動的に設定することを非常に困難にする形式を使用しています(最も一般的な形式である圧縮スパース行のグーグル)。

あなたが言ったように、ほとんどのライブラリは、#1を除いてすべての要件を提供します。#2の場合、ストレージ形式を理解すれば、通常は簡単です。

インテル®MKLは、フォーマットを課さないPARDISOソルバーを提供します。必要なのは、行列/ベクトル積を実行できることだけです。ループでソルバーを呼び出し、そこから戻りコードを取得して、要求されたとおりに実行します。 do(Aによる乗算、終了条件のチェック、前処理など)。このようにして、必要なストレージスキームを使用できます。たとえば、マトリックスを保存したくない場合や、ファンキーな保存形式を使用している場合に便利です。

要件(特に#1)は、四分木ベースのスパース行列の優れた候補になります。しかし、私はこれの良い実装を知りません。あなたがそれをコーディングする/それの実装を見つけることができれば、私は感謝するでしょう。

于 2010-12-12T13:15:33.637 に答える
1

Intel のMKLを使用してとても満足しました。

于 2010-12-12T11:01:36.113 に答える
0

TAUCSまたはMUMPSを試してください。

私は個人的にTAUCSを使用して画像処理で100万×100万のオーダーのスパース行列を解くプロジェクトのためにTAUCSを試しました。これにより、処理できるサイズがわかります。

これらのパッケージには、疎行列をエンコードする方法について独自の「形式」が付属しているというアレクサンドルに同意しますが、ゼロ以外の要素がどこにあるかをソルバーに伝える必要があるため、これは避けられません。しかし、明るい面では、それらを学ぶのは難しくありません。ちなみに、TAUCS は圧縮列ストレージ (CCS) 形式を使用します。Alexandre が言及しているのは、おそらく圧縮行ストレージ (CRS) です。行列内の要素の (i, j) 「位置」で要素値を明示的にエンコードする、より一般的な形式が 1 つありますが、それはそれについてです。

これらのパッケージの詳細については、www.matrixprogramming.comを参照してください。

于 2011-12-28T04:29:49.793 に答える