私はスパース行列のために私自身の線形方程式ソルバを書く必要があります。 私はスパース行列に任意の種類のデータ構造を自由に使用できます。また、共役勾配を含むいくつかの解決策を実装する必要があります。クラスの高速スパース行列乗算
ベクトルとの乗算が比較的速いような疎行列を保存する有名な方法があるのだろうかと思っていました。
現在のところ、私のスパース行列は基本的にラップされたstd::map< std::pair<int, int>, double>
で、データがあればそれを格納します。これは、各行列要素のルックアップを実行しなければならないので、ベクトルからO(n²)複雑度への行列の乗算をO(n²log(n))に変換します。 私はYale Sparse行列形式を調べました。要素の取得もO(log(n))にあるようですので、はるかに速いかどうかはわかりません。
参考のために、私は5000エントリで入力された800x800のマトリックスを持っています。共役勾配法を用いてこのようなシステムを解決するには、およそ450秒かかります。
別のデータ構造を使用するともっと早くできると思いますか?
ありがとうございました!
まずはウィキペディアを読んでください。 http://en.wikipedia.org/wiki/Sparse_matrixには、効率的な操作を提供する一般的なストレージメソッドの良いリストがあります。 –
@ソンワン:クラスの目的は、基本的には独自の有限要素法ソルバーをロールバックすることです – lezebulon