Mathematics | ![]() ![]() |
はじめに
スパース行列は、大部分がゼロ要素である行列の特別なクラスです。このプロパティは、MATLABでは、
スパース行列ストレージ
フル行列の場合、MATLABはすべての行列要素を内部にストアします。ゼロの要素の部分も、非ゼロ要素の部分と同じストレージ容量を必要とします。しかし、スパース行列の場合、MATLABは非ゼロ要素とそのインデックスのみをストアします。ゼロ要素が含まれる割合の高い大きな行列では、この方法はデータストレージ容量に対するメモリ総量をかなり少なくします。
MATLABは、実要素をもつスパース行列を内部にストアするため3つの配列をもっています。nnz
個の非ゼロ要素をもつm
行n
列のスパース行列を考えましょう。
nnz
の非ゼロ要素の数になります。nnz
の長さと同じです。n
個のポインタとそれらの配列の最後を示すポインタを含むものです。3番目の配列の長さは、n+1
です。この行列は、nnz
個の浮動小数点数とnnz+n+1
個の整数をストアするストレージを必要とします。浮動小数点数は8バイト、整数は4バイトで、スパース行列をストアするためには、
8*
nnz + 4*
(nnz+n+1)
のストレージが必要です。複素数要素をもつスパース行列もまた取り扱えます。この場合、MATLABは、非ゼロ要素の虚数部をストアするためnnz
の長さの4番目の配列を必要とします。要素は、実数部または虚数部のどちらかが非ゼロであれば、要素としては非ゼロと考えます。
一般的なストレージ情報
whos
コマンドを使って、行列のサイズ、クラスを含む行列ストレージに関する高水準の情報を得ることができます。たとえば、つぎの whos
リストは、同じ行列をスパースで表したものと、フルで表したものとの情報を示しています。
whos Name Size Bytes Class M_full 1100x1100 9680000 double array M_sparse 1100x1100 4404 sparse array Grand total is 1210000 elements using 9684404 bytes
使用されるバイト数は、ゼロ要素の部分を含んでいないために、スパースの場合のほうが、かなり少なくなっています。この場合。スパース行列の密度は、4404/9680000で、約 0.00045% です。
![]() | 関数のまとめ | スパース行列の作成 | ![]() |