読者です 読者をやめる 読者になる 読者になる

理科系の備忘録

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

matlabのsparse行列

そもそもsparse行列の意味をよく理解していなかった.Wikipediaで調べたところ以下の様な解答を得た.

疎行列(そぎょうれつ)とは,成分のほとんどが零である行列のことをいう。スパース行列とも言う。

ほとんどってなんだろう.過半数?

matlabではsparse関数によってsparse行列をつくることができる.つまり「ほとんどが零である行列」をつくることができる.

a = sparse( i, j, s, m, n, nzmax)

i, j, sはそれぞれベクタ,m,nは行列の大きさである.nzmax個の非ゼロ要素を持つ行列をつくる.nzmaxは省略するとnzmax = length(s)が割り当てられる.

sparse行列を試しにつかってみると以下のようになる.

cm = sparse([1 1 2 2 3 3 4 5],[2 3 4 5 4 5 6 6],[2 3 3 1 1 1 2 3],6,6)

cm =

   (1,2)        2
   (1,3)        3
   (2,4)        3
   (3,4)        1
   (2,5)        1
   (3,5)        1
   (4,6)        2
   (5,6)        3

sparse関数の1つ目と2つ目のベクトルで行列の要素を指定して,3つ目のベクトルでその値を決めている.行列の大きさは6x6で,指定した値以外のところは勝手に0が入る.座標っぽい表現になっているけど,内部的には

cm                     <6x6 sparse double>

と6x6のdoubleの行列になっているようだ.

また,普通の行列とsparse行列へ変換,あるいはその逆の変換も可能.
sparse行列をsa,普通の行列をnaとすると

sa = sparse(na)
na = full(sa)

とすれば,それぞれ変換ができる.