らんだむな記憶

blogというものを体験してみようか!的なー

ぼんやりと対角化と特異値分解をただ眺める

octave遊び。

対称正定値行列をeig()関数で対角化してみる。
理論上は直交行列で対角化できる、はず。

>> A = [5 2;2 5]
A =

   5   2
   2   5

>> [V, lambda] = eig(A)
V =

  -0.70711   0.70711
   0.70711   0.70711

lambda =

Diagonal Matrix

   3   0
   0   7

>> V'*lambda*V
ans =

   5.0000   2.0000
   2.0000   5.0000

>> V'*V
ans =

   1.00000   0.00000
   0.00000   1.00000

確かにそうなっているようだ。

対称正定値行列の場合は、特異値分解も対角化と同じ分解表示でもOKなはずだ。(別に異なってても良いと思うけど)

>> [U, S, V] = svd(A)
U =

  -0.70711  -0.70711
  -0.70711   0.70711

S =

Diagonal Matrix

   7.0000        0
        0   3.0000

V =

  -0.70711  -0.70711
  -0.70711   0.70711

やはり、本質的には対角化と同じ結果が返ってくるようだ。
ただ、特異値分解の場合、特異値の大きいものほど若いインデックスの場所に配置されていそう。
help svdでもその順番について明記はされていないが。
一般論で無限次元Hilbert空間上のコンパクト作用素特異値分解の場合、特異値はある非負の有界領域に分布して高々0のみを集積点にもつので、大きいほうから0に向かって並べるのが自然。
という意味では有限次元でもそう並べるのが妥当と言えば妥当か。

んじゃ、Jordan細胞の場合どうなんだろう?
右上に1があるような細胞なら対角化はできない。

>> A= [2 1;0 2]
A =

   2   1
   0   2

>> [V, lambda] = eig(A)
V =

   1.00000  -1.00000
   0.00000   0.00000

lambda =

Diagonal Matrix

   2   0
   0   2

固有値2に属する固有ベクトルを並べてきたな。固有空間の次元は1なので、あまり2個並べられても... とは思わないでもないが。

特異値分解ならさくっと直交行列で求めてくる。なるほどなぁ。

>> [U, S, V] = svd(A)
U =

   0.78821  -0.61541
   0.61541   0.78821

S =

Diagonal Matrix

   2.5616        0
        0   1.5616

V =

   0.61541  -0.78821
   0.78821   0.61541

>> U'*U
ans =

   1   0
   0   1

>> V'*V
ans =

   1   0
   0   1