特異値分解
特異値分解は、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 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]