Mathematics | ![]() ![]() |
スパース行列の作成
MATLABは、自動的にスパース行列を作る機能はまだ用意していません。そのため、行列でゼロ要素の占める割合が大きいかどうかユーザが判断して、スパース手法を使うかどうかを決めなければなりません。
行列の密度は、行列要素の総数で非ゼロ要素数を割ったもので表します。非常に低い密度の行列が、スパースフォーマットの使用の良い基準になります。
フル行列からスパース行列への変換
フル行列をスパースストレージに変換するには、関数sparse
を一つの引数(フル行列名)と共に使ってください。
S = sparse(A)
A = [ 0 0 0 5 0 2 0 0 1 3 0 0 0 0 4 0]; S = sparse(A)
S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
を出力します。プリントされる出力は、S
の非ゼロ要素とその行と列のインデックスをリストするものです。要素は、内部データ構造を反映して、その列に従ってソートされます。
行列の次数があまり大きくなければ、スパース行列をフルストレージに関数 full
を使って変換できます。例えば、A = full(S)
は、例題の行列変換を逆変換します。
フル行列をスパースストレージに変換することは、スパース行列作成法としては、あまり使われるものではありません。行列の大きさがフルストレージとして十分小さいものならば、スパースストレージへの変換はあまり意味をもちません。
直接的にスパース行列を作成
関数sparse
を5つの引数と共に使って、非ゼロ要素のリストからスパース行列を作ることができます。
S = sparse(i,j,s,m,n)
i
とj
は、行列の非ゼロ要素の行と列のインデックスを表すベクトルです。s
は、(i,j)
により設定されるインデックスにより示される非ゼロ値のベクトルです。m
は、結果の行列に対する行の次元数で、n
は列の次元数です。
S = sparse([3 2 3 4 1],[1 2 2 3 4],[1 2 3 4 5],4,4) S = (3,1) 1 (2,2) 2 (3,2) 3 (4,3) 4 (1,4) 5
sparse
コマンドは、いろいろな使い方を行ないます。上の例題は、行列の中の非ゼロ要素の最大数をlength(s)
に設定する型です。最大数よりも大きな値を6番目に設定すると、必要なストレージの量を変更しないで、後で非ゼロ要素を加えることができます。
例題:2階微分演算子
2階微分演算子の行列表現は、スパース行列の良い例題です。これは、対角部に-2sをもち、1つ上対角(superdiagonal)と1つ下対角(subdiagonal)に1をもつ三角対角行列です。これを作るのにいろいろな方法があります。ここで示すものも一つの方法です。
D = sparse(1:n,1:n,-2*ones(1,n),n,n); E = sparse(2:n,1:n-1,ones(1,n-1),n,n); S = E+D+E'
n = 5
に対して、MATLABは、つぎの出力を行ないます。
S = (1,1) -2 (2,1) 1 (1,2) 1 (2,2) -2 (3,2) 1 (2,3) 1 (3,3) -2 (4,3) 1 (3,4) 1 (4,4) -2 (5,4) 1 (4,5) 1 (5,5) -2
さて、F = full(S)
は、対応するフル行列を表示します。
F = full(S) F = -2 1 0 0 0 1 -2 1 0 0 0 1 -2 1 0 0 0 1 -2 1 0 0 0 1 -2
行列の対角要素からスパース行列を作成
行列の対角要素をベースにスパース行列を作成するには、関数spdiags
を使って行ないます。このシンタックスは、つぎのとおりです。
S = spdiags(B,d,m,n)
B
の列j
の中の要素は、d
の要素に対応する対角要素番号j
(負は下対角の番号、正は上対角番号)により設定される対角になります。例えば、行列B
とベクトルd
を考えましょう。
B =
41 11 0
52 22 0
63 33 13
74 44 24
d =
-3
0
2
この行列を使って、7行4列のスパース行列A
を作成しましょう。
A = spdiags(B,d,7,4) A = (1,1) 11 (4,1) 41 (2,2) 22 (5,2) 52 (1,3) 13 (3,3) 33 (6,3) 63 (2,4) 24 (4,4) 44 (7,4) 74
full(A)
ans =
11 0 13 0
0 22 0 24
0 0 33 0
41 0 0 44
0 52 0 0
0 0 63 0
0 0 0 74
spdiags
は、スパース行列から対角要素を取り出すか、または、既に存在する対角要素を新しい値で置き換えることもできます。詳細は、help
spdiags
とタイプインしてください。
![]() | はじめに | MATLABの外部からスパース行列を読み込む | ![]() |