Main Content

特異値分解

特異値分解は、mn 列の行列 AA = U*S*V' として表します。ここで、S は、A の特異値を対角要素としてもつ mn 列の対角行列です。mm 列の行列 U の列は、対応する特異値の左特異ベクトルです。nn 列の行列 V の列は、対応する特異値の右特異ベクトルです。V'V のエルミート転置 (転置の複素共役) です。

行列の特異値分解を計算するには、svd を使用します。この関数を使用すると、行列の特異値を単独で計算したり、特異値と特異ベクトルの両方を 1 回の関数呼び出しで計算したりすることができます。特異値のみを計算するには、出力引数を指定せずに svd を使用します。

svd(A)

または、出力引数を 1 つ指定します。

S = svd(A)

行列の特異値と特異ベクトルを計算するには、3 つの出力引数を使用します。

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

svd は、列が特異ベクトルである 2 つのユニタリ行列 U および V を返します。また、対角要素として特異値を含む対角行列 S も返します。3 つの行列すべての要素は浮動小数点数です。計算の精度は、digits の現在の設定によって決まります。

各要素が A(i,j) = 1/(i - j + 1/2) によって定義される nn 列の行列 A を作成します。この行列を作成する最も簡単な方法は、次のものです。

n = 3;
for i = 1:n
    for j = 1:n
      A(i,j) = sym(1/(i-j+1/2));
   end
end

n = 3 の場合、行列は以下のようになります。

A
A =
[   2,  -2, -2/3]
[ 2/3,   2,   -2]
[ 2/5, 2/3,    2]

この行列の特異値を計算します。svd を直接使用すると、シンボリック厳密解の結果が返されます。この行列では、結果が非常に長くなります。数値の結果を短くする場合は、vpa を使用して A の要素を浮動小数点数に変換します。それから、svd を使用して、可変精度の演算によりこの行列の特異値を計算します。

S = svd(vpa(A))
S =
 3.1387302525015353960741348953506
 3.0107425975027462353291981598225
 1.6053456783345441725883965978052

次に、A の特異値と特異ベクトルを計算します。

[U,S,V] = svd(A)
U =
[  0.53254331027335338470683368360204,  0.76576895948802052989304092179952,...
                                        0.36054891952096214791189887728353]
[ -0.82525689650849463222502853672224,  0.37514965283965451993171338605042,...
                                        0.42215375485651489522488031917364]
[  0.18801243961043281839917114171742, -0.52236064041897439447429784257224,...
                                        0.83173955292075192178421874331406]
 
S =
[ 3.1387302525015353960741348953506,                                 0,...
                                                                     0]
[                                 0, 3.0107425975027462353291981598225,...
                                                                     0]
[                                 0,                                 0,...
                                     1.6053456783345441725883965978052]
 
V =
[  0.18801243961043281839917114171742,  0.52236064041897439447429784257224,...
                                        0.83173955292075192178421874331406]
[ -0.82525689650849463222502853672224, -0.37514965283965451993171338605042,...
                                        0.42215375485651489522488031917364]
[  0.53254331027335338470683368360204, -0.76576895948802052989304092179952,...
                                        0.36054891952096214791189887728353]