行列は通常2次元の配列として格納されます。 配列の各エントリは行列の要素ai,jを表し、iとjの2つのインデックスでアクセスされる。従来、iは行インデックスで上から下に番号が付けられ、jは列インデックスで左から右に番号が付けられていた。 m × n 行列の場合、この形式で行列を格納するために必要なメモリ量は m × n に比例します (行列の次元も格納する必要があるという事実は無視します)。
疎行列の場合、非ゼロ項目のみを格納することにより、メモリ要件を大幅に削減することが可能になります。 非ゼロエントリの数と分布に応じて、異なるデータ構造を使用することができ、基本的なアプローチと比較して、大幅なメモリ削減を実現することができます。 トレードオフは、個々の要素へのアクセスがより複雑になり、元の行列を明確に復元できるようにするために追加の構造が必要になることである。
- 形式は2つのグループに分けることができる。 これらは通常、行列を構築するために使用されます。
- 効率的なアクセスと行列操作をサポートするもの、例えばCSR (Compressed Sparse Row) やCSC (Compressed Sparse Column) など。
Dictionary of keys (DOK)Edit
DOKは(行、列)対とその要素の値を対応付ける辞書から構成されています。 辞書から欠落している要素は0とみなされる。 この形式は、ランダムな順序で疎な行列を徐々に構築するには適していますが、辞書順に非ゼロ値を反復するのには適していません。
List of lists (LIL)Edit
LIL は1行に1つのリストを格納し,各エントリには列インデックスと値が含まれます. 通常、これらのエントリは、より高速に検索するために列インデックスでソートされて保持されます。
座標リスト(COO)編集
COOは(行、列、値)タプルのリストを格納します。 理想的には、ランダムアクセス時間を改善するために、エントリはまず行インデックスで、次に列インデックスでソートされる。
Compressed sparse row (CSR, CRS or Yale format)Edit
圧縮スパースロウ (CSR) または圧縮行記憶 (CRS) または Yale 形式は、それぞれ非零値、行の長さ、列インデックスを含む3つの(1次元)配列によって行列Mを表現しています。 COOと似ていますが、行のインデックスを圧縮しているため、このような名前がついています。 この形式により、高速な行アクセスと行列-ベクトル乗算(Mx)が可能になります。 CSR形式は少なくとも1960年代半ばから使用されており、最初の完全な記述は1967年に掲載されました。
CSR形式は、3つの(1次元)配列(V、COL_INDEX、ROW_INDEX)を使用して行形式で疎m×n行列Mを格納します。
- 配列VとCOL_INDEXは長さNNZで、それぞれ非ゼロ値とその列インデックスを含む。
- 配列ROW_INDEXは長さm + 1で、VとCOL_INDEXにおける与えられた行を始めるインデックスをコード化する。 最後の要素はNNZ 、すなわち すなわち,最後の有効なインデックスNNZ – 1の直後のVにおける架空のインデックスです.
例えば、行列
( 5 0 0 0 8 0 0 0 3 0 0 6 0 0 ) {displaystyle {begin{pmatrix}5&0&0&0&8&00