疎な(スパース)配列:リストの操作
通常Mathematica ではリストは要素の明示的なリストを与えて指定する.しかし,大きな配列を扱っているような場合には,特定の位置における要素の値が何かだけを指定し,その他の要素はすべてデフォルト値(通常ゼロ)にすることができると便利なことがある.Mathematica ではSparseArrayオブジェクトを使ってこうすることができる.
| {e1,e2,...}, {{e11,e12,...},...}, ... | 通常のリスト |
| SparseArray[{pos1->val1,pos2->val2,...}] |
| 疎な配列 |
通常のリストと疎な配列
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
| Out[4]= |  |
| SparseArray[list] | list の疎な配列版 |
| SparseArray[{pos1->val1,pos2->val2,...}] |
| 位置 で値が である疎な配列 |
| SparseArray[{pos1,pos2,...}->{val1,val2,...}] |
| 同じ疎な配列 |
| SparseArray[Band[{i,j}]->val] | 値val である帯状疎配列 |
| SparseArray[data,{d1,d2,...}] | × ×...の疎な配列 |
| SparseArray[data,dims,val] | デフォルト値 val の疎な配列 |
| Normal[array] | array の通常のリスト版 |
| ArrayRules[array] | array の位置と値の規則 |
疎な配列の作成と変換
| Out[5]= |  |
| Out[6]= |  |
デフォルト値が

で長さが7の疎な配列を作る.
| Out[7]= |  |
| Out[8]= |  |
| Out[9]= |  |
Out[10]//MatrixForm= |
| |  |
SparseArrayの重要な特徴は,位置の指定にパターンが使える点である.

に一致するすべての位置が

である4×4の疎な配列を指定する.
| Out[11]= |  |
| Out[12]= |  |
| Out[13]= |  |
こうすると第3列がすべて

になる.
| Out[14]= |  |
SparseArray[rules]は可能なすべての位置指定を取り,次に rules を適用して各々の値を決定するものであると考えることができる.例によってリストの最初で与えられた規則が最初に適用される.
| Out[15]= |  |
| Out[16]= |  |
偶数位置に

を挿入する.
| Out[17]= |  |
| Out[18]= |  |
| Out[19]= |  |
| Out[20]= |  |
| Out[21]= |  |
いろいろな目的のために,Mathematica はSparseArrayオブジェクトをこれに対応する他の通常のリストと同じように扱う.このため,例えば疎な配列オブジェクトの部分を問うと,Mathematica は対応する通常のリストにおける部分について問われたかの如き処理をする.
| Out[22]= |  |
| Out[23]= |  |
疎な配列の部分はこれに対応する通常の部分と同じである.
| Out[24]= |  |
| Out[25]= |  |
多くの操作でSparseArrayオブジェクトは通常のリストと同じように扱われる.可能な場合は結果として疎な配列が返される.
| Out[26]= |  |
| Out[27]= |  |
| Out[28]= |  |
| Out[29]= |  |
Mathematica は疎な配列をSparseArrayという頭部を持つ式として表す.疎な配列は評価されると常にSparseArray[Automatic, dims, val, ...]という構造を持つ最適化された標準形に変換される.
しかしこの構造がはっきりすることはあまりない.Lengthのような操作でさえも結果は対応する通常のリストで与え,生のSparseArray式構造では与えないようになっているからである.
| Out[30]= |  |
Out[31]//InputForm= |
| |  |
| Out[32]= |  |
| Out[33]= |  |