FreeMat v4.0日本語ドキュメント
疎行列

 

ドキュメント目次

  • nnz  否ゼロの数
  • sparse  疎行列の作成
  • full  疎行列から密行列への変換
  • eigs  疎行列の固有値分解
  • spones  要素が1の疎行列
  • speye  疎行列eye関数
  • sprand  一様乱数疎行列
  • sprandn  正規乱数疎行列
  • spy  疎行列を可視化

--------------------------------------------------------------------
nnz 否ゼロの数
  [構文]
   y = nnz(x)

xは疎行列でも他の行列でも構いません。

  [例]

--> a = [1,0,0,5;0,3,2,0]

a =

1 0 0 5
0 3 2 0

--> nnz(a)

ans =

4

--> A = sparse(a)

A =
Matrix is sparse with 4 nonzeros
--> nnz(A)

ans =

4


--------------------------------------------------------------------
sparse 疎行列の作成

  [構文]
 y = sparse(x)
 y = sparse(m,n)
 y = sparse(i,j,v)
 y = sparse(i,j,v,m,n)

xは密行列。m,nは整数。この場合は、要素が全て0の疎行列を生成。またi,j,vに関しても整数。この場合、サイズを明示指定する場合とそうでない場合がある。

--------------------------------------------------------------------
full 疎行列から密行列の変換

  [構文]
 y = full(x)


  [例]

--> a = [1,0,4,2,0;0,0,0,0,0;0,1,0,0,2]

a =

1 0 4 2 0
0 0 0 0 0
0 1 0 0 2

--> A = sparse(a)

A =
Matrix is sparse with 5 nonzeros
--> full(A)

ans =

1 0 4 2 0
0 0 0 0 0
0 1 0 0 2


--------------------------------------------------------------------
eigs 疎行列の固有値分解

 [構文] 
 [V,D] = eigs(A,k,sigma)
 [V,D] = eigs(A,k)
 d = eigs(A,k) 
 [V,D] = eigs(A)
 d = eigs(A) 

Aは分析される行列、kは固有値の数、sigmaは使用する固有値、となります。
sigmaには以下の9つから選び設定します。

'lm' - 最大の振幅 

'sm' - 最小の振幅 

'la' - 最大の代数 (実数の対称問題に対して) 

'sa' - 最小の代数(実数の対称問題に対して)

'be' - 両方のエンド(実数の対称問題に対して)

'lr' - 最大の実数 

'sr' - 最小の実数 

'li' - 最大の虚数 

'si' - 最小の虚数

このsigmaに最も近い固有値を見つけます。

 Vは固有値ベクトル、Dおよびdは固有値となります。

本関数は、ARPACKを使用しています。FreeMatとARPACKの関係上、計算される固有値の数は、行列の行または列の数より小さくなってしまいます。

   [例]

--> a = sparse(rand(9))

a =
Matrix is sparse with 81 nonzeros
--> eigs(a)

ans =

4.6829 + 0.0000i
0.1461 - 0.8635i
0.1461 + 0.8635i
-0.5896 - 0.2277i
-0.5896 + 0.2277i
0.5487 + 0.1436i

--> eig(full(a))

ans =

4.6829 + 0.0000i
0.1461 + 0.8635i
0.1461 - 0.8635i
0.5487 + 0.1436i
0.5487 - 0.1436i
-0.5896 + 0.2277i
-0.5896 - 0.2277i
-0.1536 + 0.2692i
-0.1536 - 0.2692i
 
以下に様々なsigmaによる固有値の比較をしてみます。
 
--> eigs(a,4,'sm')

ans =

-0.1536 - 0.2692i
-0.1536 + 0.2692i
0.5487 - 0.1436i
0.5487 + 0.1436i

--> eigs(a,4,'lr')

ans =

4.6829 + 0.0000i
0.5487 - 0.1436i
0.5487 + 0.1436i
0.1461 - 0.8635i

--> eigs(a,4,'sr')

ans =

-0.5896 - 0.2277i
-0.5896 + 0.2277i
-0.1536 - 0.2692i
-0.1536 + 0.2692i

--------------------------------------------------------------------
spones 要素が1の疎行列
入力引数の要素の中で0ではない要素を1に変換して疎行列を作成します。

  [構文]

 y = spones(x)

  [例]

--> a = [1,0,3,0,5;0,0,2,3,0;1,0,0,0,1]

a =

1 0 3 0 5
0 0 2 3 0
1 0 0 0 1

--> b = spones(a)

b =
Matrix is sparse with 7 nonzeros

--> full(b)

ans =

1 0 1 0 1
0 0 1 1 0
1 0 0 0 1


--------------------------------------------------------------------
speye 疎行列のeye行列
  [構文]

 y = speye(m,n)
 y = speye(n) 

  [例]

--> I = speye(5000)

I =
Matrix is sparse with 5000 nonzeros
--> full(I(1:10,1:10))

ans =

1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 0 0 1


--------------------------------------------------------------------
sprand 一様乱数疎行列
  [構文]

 y = sprand(x)
 y = sprand(m,n,density) 

xは疎行列、mおよびnはそれぞれ行・列の数、densityは否ゼロの要素の密度(0~1)です。
  [例]

(1) 
--> x = [1,0,0;0,0,1;1,0,0]

x =

1 0 0
0 0 1
1 0 0

--> y = sprand(x)

y =
Matrix is sparse with 3 nonzeros
--> full(y)

ans =

0.1322 0 0
0 0 0.3487
0.3071 0 0

 (2)

以下は、densityが0.001の場合です。多くのシステムで下記の密行列の作成は不可能です。

--> y = sprand(10000,10000,.001)

y =
Matrix is sparse with 99946 nonzeros
--> nnz(y)/10000^2

ans =

9.9946e-04


--> full(y)
Error: Memory allocation error... You may have run out of me
mory!


--------------------------------------------------------------------
sprandn 正規乱数疎行列
  [構文]

 y = sprandn(x)
 y = sprandn(m,n,density)

  [例]

(1)

--> x = [1,0,0;0,0,1;1,0,0]

x =

1 0 0
0 0 1
1 0 0

--> y = sprandn(x)

y =
Matrix is sparse with 3 nonzeros
--> full(y)

ans =

0.3278 0 0
0 0 -1.0332
-0.8342 0 0

(2)

(2)

以下は、densityが0.001の場合です。多くのシステムで下記の密行列の作成は不可能です。

--> y = sprandn(10000,10000,.001)

y =
Matrix is sparse with 99953 nonzeros
--> nnz(y)/10000^2

ans =

9.9953e-04


--> full(y)
Error: Memory allocation error... You may have run out of me
mory!


--------------------------------------------------------------------
spy 疎行列を可視化
  [構文]

 spy(x)
 spy(x,colspec)
colspecはプロットで表示される色とシンボルです。 


  [例]
(1)

--> y = sprand(1000,1000,.001)

y =
Matrix is sparse with 1000 nonzeros
--> spy(y,'ro')

実行結果


(2)

--> A = sparse(1000,1000);
--> for i=1:25; A((1:40) + 40*(i-1),(1:40) + 40*(i-1)) = 1; end;
--> spy(A,'gx')
 
実行結果