少し背景:私は、疎な行列*ベクトルの乗算についていくつかの研究をすることに興味があります。スパース行列は、通常、列のメジャー順または行メジャー順に格納されますか?
私はスパース行列のこのデータベースを介して見てきた:
The University of Florida Sparse Matrix Collection
私は行列がで利用可能な3つの形式があることに気づいた:
- MATLAB(.MAT)
- マトリックスマーケット(.mtx)
- ハーウェルボーイング(.rb)
マトリクスは列の主要な順序(すなわち、列はお互いの直後の行ではなく、互いの直後に格納されます)。しかし、文献では、圧縮されたスパース行(CSR)形式が最も一般的な形式であるように見えます(「セルプロセッサSamuelの科学的コンピューティングカーネル」を参照)。私は何らかの形でインデックス(i、j)とそれらの座標の値が格納されていることを知っていますが、行列*ベクトル乗算を効率的に実行するためにデータを最初に再フォーマットしなければならないと思います。
私の実装では、行の主要な順序でデータを格納する方が理にかなっているため、行内の要素は連続したメモリアドレスに格納されるため、順番にアクセスできます。
CSRフォーマットでは、データが行のメジャー順に格納されていると見なされるようです。だから私はこれが疑問です: データは、通常、疎なマトリックスのためにメモリにどのように格納されますか?スパース行列*ベクトル計算の一部は、列メジャーから行メジャー順にデータを再グループ化することを含むか? この変換が一般的に疎な行列ベンチマーク結果で考慮されているのだろうかと疑問に思っています。
)MATLABがどのようにスパースするのか行列? – beaker
カラムの主要フォーマットは、Fortranの規則に従っています。 M * v行のメジャーはあなたがすでに分かっているように優れています。 – karakfa
@ビーカー、いいえ。私は、アプリケーションがメモリ内のデータをどのように格納するのかと思っています。最初はカラムメジャーオーダーであり、次にローメジャーオーダーに変換する必要がありますか?または、ベンチマークの結果を出す際のオーバーヘッドを考慮せずに、データをCSR形式に再フォーマットするのが大丈夫ですか? – Veridian