How to | 疎行列を操作する方法

行列のスパース表現は要素をそれぞれすべて保管するということがないので,便利である.1つの特定値が非常に頻繁に現れる場合に,スパース表現を使うと大変便利なことがある.Wolfram言語は,SparseArrayで行列,ベクトル,テンソルのスパース表現を提供する.これらはリストで表示される密行列と非常に深く関係している.リストに使用できる操作のほとんどがスパース配列にも使用できる.

スパース配列を作成する方法は数多くある.その多くが関数SparseArrayを使用する.

以下は密行列から疎行列を作成する.疎行列は大変大きなものであるかもしれないので,行列のように表示されることはない.

In[1]:=
Click for copyable input
Out[1]=

それでも行列を普通の行列のようにフォーマットすることができる:

In[2]:=
Click for copyable input
Out[2]//MatrixForm=

以下では非零である要素を指定して疎行列を作成する:

In[3]:=
Click for copyable input
Out[3]=

Wolfram言語のパターンと一緒に規則構文「」を使用して,構造疎行列を作成することができる.この例では三重行列を作成する:

In[4]:=
Click for copyable input
Out[4]//MatrixForm=

Bandを使ってさらに複雑な行列を作成することができる.この例では帯が反対角線上に作成される:

In[5]:=
Click for copyable input
Out[5]//MatrixForm=

HarwellBoeingあるいはMatrix Marketといった疎行列の形式のひとつをインポートして疎行列を作成することもできる.

これはサンプル行列であり10591個の非零の要素を持つ961×961行列をインポートする:

In[6]:=
Click for copyable input
Out[6]=
    

密行列に使える関数は通常疎行列にも使用できる.これらの関数はしばしば高速で密行列に変換しなくても使用できる特別の疎行列の技術を使用する.これは時間とメモリの大きな節約に繋がる.

以下は帯を持つ疎行列を作成する:

In[1]:=
Click for copyable input
Out[1]=

以下でそれを表示する:

In[2]:=
Click for copyable input
Out[2]//MatrixForm=

疎行列がそれ自身を掛け合せた場合,結果も疎行列となるが,ゼロの要素数は前ほど最適ではないことがある:

In[3]:=
Click for copyable input
Out[3]=

以下はその結果で,ゼロの要素数が減ったことが分かる:

In[4]:=
Click for copyable input
Out[4]//MatrixForm=
    

密行列の場合とおなじように,疎行列の要素を抽出して設定することができる:

In[1]:=
Click for copyable input
Out[1]=

以下は要素(2,3)を抽出する:

In[2]:=
Click for copyable input
Out[2]=

以下は要素(2,3)が20となるように設定する:

In[3]:=
Click for copyable input
Out[3]//MatrixForm=
    

疎行列の中の非零の要素の位置を見ることができるようにすると便利なことがある.これはMatrixPlotを使って行うことができる.行列に多くの要素が含まれるような場合でも,MatrixPlotは行列の希薄パターンを効率的に見せる方法を提供する.

Importを使って大きな行列をロードする:

In[1]:=
Click for copyable input
Out[1]=

これで行列がプロットされ,行列が非常にはっきりした構造を持つことを示している:

In[2]:=
Click for copyable input
Out[2]=