|
2.4.5 疎な(スパース)配列
通常Mathematicaではリストは要素の明示的なリストを与えて指定する.しかし,大きな配列を扱っているような場合には,特定の位置における要素の値が何かだけを指定し,その他の要素はすべてデフォルト値(通常ゼロ)が使えると便利なことがある.MathematicaではSparseArrayオブジェクトを使ってこうすることができる.

通常のリストと疎な配列
疎な配列を指定する.
In[1]:= SparseArray[{2->a, 5->b}]
Out[1]= 
こちらは通常のリストである.
In[2]:= Normal[%]
Out[2]= 
これは2次元の疎な配列を指定する.
In[3]:= SparseArray[{{1,2}->a, {3,2}->b, {3,3}->c}]
Out[3]= 
これは通常のリストのリストである.
In[4]:= Normal[%]
Out[4]= 

疎な配列の作成と変換
リストの疎な配列版を生成する.
In[5]:= SparseArray[{a, b, c, d}]
Out[5]= 
通常のリストに変換し直す.
In[6]:= Normal[%]
Out[6]= 
デフォルト値がxで長さが7の疎な配列を作る.
In[7]:= SparseArray[{3->a, 5->b}, 7, x]
Out[7]= 
これは上記に対応する通常のリストである.
In[8]:= Normal[%]
Out[8]= 
これは疎な配列で使われた規則である.
In[9]:= ArrayRules[%%]
Out[9]= 
SparseArrayの重要な特徴は,指定する位置にパターンが使える点である.
{i_, i_}に一致するすべての位置が1である の疎な配列を指定する.
In[10]:= SparseArray[{i_, i_} -> 1, {4, 4}]
Out[10]= 
結果は の単位行列になる.
In[11]:= Normal[%]
Out[11]= 
これは余分な要素を持った単位行列である.
In[12]:= Normal[SparseArray[{{1, 3}->a, {i_, i_}->1}, {4, 4}]]
Out[12]= 
こうすると第3列がすべて aになる.
In[13]:= Normal[SparseArray[{{_, 3}->a, {i_, i_}->1}, {4, 4}]]
Out[13]= 
SparseArray[rules]は可能なすべての位置指定を取り,次にrulesを適用して各々の値を決定するものであると考えることができる.例によってリストの最初で与えられた規則が最初に適用される.
ランダムな対角行列を生成する.
In[14]:= Normal[SparseArray[{{i_, i_} :> Random[]}, {3, 3}]]
Out[14]= 
値が指標に依存する規則を使うことができる.
In[15]:= Normal[SparseArray[i_ -> i^2, 10]]
Out[15]= 
偶数位置にpを挿入する.
In[16]:= Normal[SparseArray[{_?EvenQ->p, i_->i^2}, 10]]
Out[16]= 
代替値を含むパターンを使うことができる.
In[17]:= Normal[SparseArray[{1|3, 2|4}->a, {4, 4}]]
Out[17]= 
パターンに制約条件を付けることもできる.
In[18]:= Normal[SparseArray[i_/;3<i<7 -> p, 10]]
Out[18]= 
こうすると帯対角行列ができる.
In[19]:= Normal[SparseArray[{{i_, j_} /; Abs[i - j] < 2 -> i + j}, {5, 5}]]
Out[19]= 
いろいろな目的のために,MathematicaはSparseArrayオブジェクトをこれに対応する他の通常のリストと同じように扱う.このため,例えば疎な配列オブジェクトの部分を問うと,Mathematicaは対応する通常のリスとにおける部分について問われたかの如き処理をする.
これは疎な配列オブジェクトを生成する.
In[20]:= s = SparseArray[{2->a, 4->b, 5->c}, 10]
Out[20]= 
これは上記に対応する通常のオブジェクトである.
In[21]:= Normal[s]
Out[21]= 
疎な配列の部分はこれに対応する通常の部分と同じである.
In[22]:= s[[2]]
Out[22]= 
この部分のデフォルト値は0である.
In[23]:= s[[3]]
Out[23]= 
多くの操作でSparseArrayオブジェクトは通常のリストと同じように扱われる.可能な場合は結果として疎な配列が返される.
これは疎な配列を与える.
In[24]:= 3 s + x
Out[24]= 
これは対応する通常のリストである.
In[25]:= Normal[%]
Out[25]= 
Dotは疎な配列オブジェクトに直接働く.
In[26]:= s . s
Out[26]= 
疎な配列と通常のリストを混ぜることもできる.
In[27]:= s . Range[10]
Out[27]= 
Mathematicaは疎な配列をSparseArrayという頭部を持ち式として表す.疎な配列は評価されると常にSparseArray[Automatic, dims, val, ... ]という構造を持つ最適化された標準形に変換される.
しかしこの構造がはっきりすることはあまりない.Lengthのような操作でさえも結果は対応する通常のリストであたえ生のSparseArray式構造では与えないようになっているからである.
これは疎な配列を生成する.
In[28]:= t = SparseArray[{1->a, 5->b}, 10]
Out[28]= 
これが根底にある最適化された式構造である.
In[29]:= InputForm[%]
Out[29]//InputForm= SparseArray[Automatic, {10}, 0, {1, {{0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2}, {}}, {a, b}}]
Lengthは対応する通常のリストの長さを与える.
In[30]:= Length[t]
Out[30]= 
Mapもまた個々の値に働く.
In[31]:= Normal[Map[f, t]]
Out[31]= 
|