How to | 疎行列を操作する方法
行列のスパース表現は要素をそれぞれすべて保管するということがないので,便利である.1つの特定値が非常に頻繁に現れる場合に,スパース表現を使うと大変便利なことがある.Wolfram言語は,SparseArrayで行列,ベクトル,テンソルのスパース表現を提供する.これらはリストで表示される密行列と非常に深く関係している.リストに使用できる操作のほとんどがスパース配列にも使用できる.
スパース配列を作成する方法は数多くある.その多くが関数SparseArrayを使用する.
以下は密行列から疎行列を作成する.疎行列は大変大きなものであるかもしれないので,行列のように表示されることはない.
mat = SparseArray[ {{0, 1, 0}, {1, 0, 1}, {0, 1, 0}}]それでも行列を普通の行列のようにフォーマットすることができる:
mat//MatrixFormmat = SparseArray[ {{1, 2} -> 1, {2, 1} -> 1, {2, 3} -> 1, {3, 2} -> 1}]Wolfram言語のパターンと一緒に規則構文「:>」を使用して,構造疎行列を作成することができる.この例では三重行列を作成する:
mat = SparseArray[ {i_, j_} /; Abs[i - j] ≤ 1 :> 1, {8, 8}];
mat//MatrixFormBandを使ってさらに複雑な行列を作成することができる.この例では帯が反対角線上に作成される:
mat = SparseArray[Band[{1, -1}, {-1, 1}, {1, -1}] -> x, {5, 5}];
mat//MatrixFormHarwell–BoeingあるいはMatrix Marketといった疎行列の形式のひとつをインポートして疎行列を作成することもできる.
これはサンプル行列であり10591個の非零の要素を持つ961×961行列をインポートする:
Import["LinearAlgebraExamples/Data/dwg961b.cua", "HarwellBoeing"]密行列に使える関数は通常疎行列にも使用できる.これらの関数はしばしば高速で密行列に変換しなくても使用できる特別の疎行列の技術を使用する.これは時間とメモリの大きな節約に繋がる.
mat = SparseArray[{Band[{2, 1}] -> 1., Band[{1, 1}] -> 2., Band[{1, 2}] -> 3.}, 5]mat//MatrixForm疎行列がそれ自身を掛け合せた場合,結果も疎行列となるが,ゼロの要素数は前ほど最適ではないことがある:
mat1 = mat.matmat1//MatrixForm疎行列の中の非零の要素の位置を見ることができるようにすると便利なことがある.これはMatrixPlotを使って行うことができる.行列に多くの要素が含まれるような場合でも,MatrixPlotは行列の希薄パターンを効率的に見せる方法を提供する.
Importを使って大きな行列をロードする:
mat = Import["LinearAlgebraExamples/Data/dwg961b.cua", "HarwellBoeing"]これで行列がプロットされ,行列が非常にはっきりした構造を持つことを示している:
MatrixPlot[mat]