|
3.7.12 疎な(スパース)配列
多くの大規模な線形代数アプリケーションは多くの要素を持つ行列を含んでいるが,非零要素のものは比較的少ない.MathematicaではSparseArray オブジェクトを使って2.4.5で説明してあるようにこれを効果的に表現することができる.SparseArrayオブジェクトは非零の値がどこに表れるのかを指定する規則のリストを使って作用する.

疎な配列の指定
2.4.5で説明してあるように,パターンを使って疎な配列中の要素集団を指定することができる.また任意のランクのテンソルに対応する疎な配列を作ることもできる.
これで148個の非零要素がある の疎な数値行列を作る.
In[1]:= m = SparseArray[{{30, _} -> 11.5, {_, 30} -> 21.5, {i_, i_} -> i}, {50, 50}]
Out[1]= 
これで行列要素を視覚的に表す.
In[2]:= ListDensityPlot[-m]

Out[2]= 
これは行列中の大きい方から4番目までの固有値である.
In[3]:= Eigenvalues[m, 4]
Out[3]= 
DotはSparseArrayの結果を与える.
In[4]:= m . m
Out[4]= 
通常の配列と同じように部分を抽出することができる.
In[5]:= %[[20, 20]]
Out[5]= 
通常のリストに対するのと同じようにSparseArrayに対してもほとんどの標準的な構造操作を行うことができる.結果が疎である場合はSparseArrayオブジェクトが返されるのが通例である.

SparseArrayオブジェクトに直接行える構造操作の例
これはmの第1列を与える.ここには非零要素は2つしかない.
In[6]:= m[[All, 1]]
Out[6]= 
mの第1列中の各要素に3を足す.
In[7]:= m[[All, 1]] = 3 + m[[All, 1]]
Out[7]= 
これで第1列の全要素が非零になった.
In[8]:= m[[All, 1]]
Out[8]= 
これは第2行の非零要素の規則を与える.
In[9]:= ArrayRules[m[[2]]]
Out[9]= 

疎な配列を得る典型的な方法
これは三重対角ランダム行列を生成する.
In[10]:= SparseArray[{i_, j_} /; Abs[i-j] <= 1 :> Random[], {100, 100}]
Out[10]= 
行列を10乗してもまだかなり疎である.
In[11]:= MatrixPower[%, 10]
Out[11]= 
係数を疎な配列として抽出する.
In[12]:= s = CoefficientArrays[{c + x - z == 0, x + 2 y + z == 0}, {x, y, z}]
Out[12]= 
これは対応する通常の配列である.
In[13]:= Normal[%]
Out[13]= 
これでもとの形式を再生する.
In[14]:= s[[1]] + s[[2]] . {x, y, z}
Out[14]= 
CoefficientArraysは通常の整方程式を扱うことができる.
In[15]:= s = CoefficientArrays[ {c + x^2 - z == 0, x^2 + 2 y + z^2 == 0}, {x, y, z}]
Out[15]= 
二次式部分の係数はランク3のテンソルで与えられる.
In[16]:= Normal[%]
Out[16]= 
これでもとの形を再生する.
In[17]:= s[[1]] + s[[2]] . {x, y, z} + s[[3]] . {x, y, z} . {x, y, z}
Out[17]= 
機械精度の疎な数値行列について,MathematicaはMatrix Market形式(.mtx)やHarwell-Boeing形式のような標準的なファイル形式をサポートする.これらの形式の行列はImportやExportを用いてインポートしたりエキスポートしたりできる.
|