特異値分解
特異値分解は、m 行 n 列の行列 A を A = U*S*V' として表します。ここで、S は、A の特異値を対角要素としてもつ m 行 n 列の対角行列です。m 行 m 列の行列 U の列は、対応する特異値の左特異ベクトルです。n 行 n 列の行列 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) によって定義される n 行 n 列の行列 A を作成します。この行列を作成する最も簡単な方法は、次のものです。
n = 3;
for i = 1:n
for j = 1:n
A(i,j) = sym(1/(i-j+1/2));
end
endn = 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]