ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

svd

シンボリック行列の特異値分解

説明

sigma = svd(A) は、シンボリック行列 A の特異値を含むベクトル sigma を返します。

[U,S,V] = svd(A) は、特異ベクトルを含む列から構成される数値ユニタリ行列 U および V と、特異値を含む対角行列 S を返します。これらの行列は条件 A = U*S*V' を満たします。ここで、V'V のエルミート転置 (複素共役転置) です。特異ベクトルの計算では可変精度の演算が使用されます。svd ではシンボリックな特異ベクトルの計算は行いません。したがって、入力行列 A は浮動小数点数に変換できなければなりません。たとえば、シンボリック数の行列を取り得ます。

[U,S,V] = svd(A,0) は、まばらな、つまりエコノミーな、特異値分解を返します。Amn 列の行列で、m > n である場合、svdU の最初の n 列のみを計算します。この場合、Snn 列の行列です。m <= n の場合、この構文は svd(A) と等価です。

[U,S,V] = svd(A,'econ') もまた、まばらな、つまりエコノミーな、特異値分解を返します。Amn 列の行列で、m >= n である場合、この構文は svd(A,0) と等価です。m < n の場合、svdV の最初の m 列のみを計算します。この場合、Smm 列の行列です。

シンボリックな特異値

55 列のシンボリックな魔方陣の特異値を計算します。

A = sym(magic(5));
sigma = svd(A)
sigma =
 
                              65
 5^(1/2)*(1345^(1/2) + 65)^(1/2)
    65^(1/2)*(5^(1/2) + 5)^(1/2)
    65^(1/2)*(5 - 5^(1/2))^(1/2)
 5^(1/2)*(65 - 1345^(1/2))^(1/2)

次に、要素がシンボリック式である行列の特異値を計算します。

syms t real
A = [0 1; -1 0];
E = expm(t*A)
sigma = svd(E)
E =
[  cos(t), sin(t)]
[ -sin(t), cos(t)]
 
sigma =
 (cos(t)^2 + sin(t)^2)^(1/2)
 (cos(t)^2 + sin(t)^2)^(1/2)

結果を単純化します。

sigma = simplify(sigma)
sigma =
 1
 1

計算を続けるため、t に設定された仮定を syms を使用して再作成することで削除します。

syms t

浮動小数点の特異値

55 列のシンボリックな魔方陣の要素を浮動小数点数に変換し、行列の特異値を計算します。

A = sym(magic(5));
sigma = svd(vpa(A))
sigma =
 
                              65.0
 22.547088685879657984674226396467
 21.687425355202639411956035427154
 13.403565997991492328585154445703
 11.900789544861194527298509087321

特異値と特異ベクトル

55 列の魔方陣の特異値と特異ベクトルを計算します。

old = digits(10);
A = sym(magic(5))
[U, S, V] = svd(A)
digits(old)
A =
 
[ 17, 24,  1,  8, 15]
[ 23,  5,  7, 14, 16]
[  4,  6, 13, 20, 22]
[ 10, 12, 19, 21,  3]
[ 11, 18, 25,  2,  9]
 
 
U =
 
[ 0.4472135955,    0.5456348731,  0.5116672736, -0.1954395076,  -0.4497583632]
[ 0.4472135955,    0.4497583632, -0.1954395076,  0.5116672736,   0.5456348731]
[ 0.4472135955, 2.420694008e-15,  -0.632455532,  -0.632455532, 1.29906993e-15]
[ 0.4472135955,   -0.4497583632, -0.1954395076,  0.5116672736,  -0.5456348731]
[ 0.4472135955,   -0.5456348731,  0.5116672736, -0.1954395076,   0.4497583632]
 
 
S =
 
[ 65.0,           0,           0,         0,           0]
[    0, 22.54708869,           0,         0,           0]
[    0,           0, 21.68742536,         0,           0]
[    0,           0,           0, 13.403566,           0]
[    0,           0,           0,         0, 11.90078954]
 
 
V =
 
[ 0.4472135955,   0.4045164361,     0.2465648962,    0.6627260007,  0.3692782866]
[ 0.4472135955, 0.005566159714,     0.6627260007,   -0.2465648962, -0.5476942741]
[ 0.4472135955,  -0.8201651916, -3.091014288e-15, 6.350407543e-16,  0.3568319751]
[ 0.4472135955, 0.005566159714,    -0.6627260007,    0.2465648962, -0.5476942741]
[ 0.4472135955,   0.4045164361,    -0.2465648962,   -0.6627260007,  0.3692782866]

USV のエルミート転置の積を 10 桁の精度で計算します。結果は、元の行列 A のすべての要素が浮動小数点数に変換された行列になります。

vpa(U*S*V',10)
ans =
 
[ 17.0, 24.0,  1.0,  8.0, 15.0]
[ 23.0,  5.0,  7.0, 14.0, 16.0]
[  4.0,  6.0, 13.0, 20.0, 22.0]
[ 10.0, 12.0, 19.0, 21.0,  3.0]
[ 11.0, 18.0, 25.0,  2.0,  9.0]

まばらもしくはエコノミーな特異値分解

2 番目の入力引数 0 を使用して、32 列の行列の、まばらな、つまりエコノミーな特異値分解を計算します。

old = digits(10);
A = sym([1 1;2 2; 2 2]);
[U, S, V] = svd(A, 0)
U =
[ 0.3333333333, -0.6666666667]
[ 0.6666666667,  0.6666666667]
[ 0.6666666667, -0.3333333333]
 
S =
[ 4.242640687, 0]
[           0, 0]
 
V =
[ 0.7071067812,  0.7071067812]
[ 0.7071067812, -0.7071067812]

次に、2 番目の入力引数 'econ' を使用して、行列 B のまばらな、つまりエコノミーな特異値分解を計算します。ここで、32 列の行列 BA の転置行列です。

B = A';
[U, S, V] = svd(B, 'econ')
digits(old)
U =
[ 0.7071067812, -0.7071067812]
[ 0.7071067812,  0.7071067812]
 
S =
[ 4.242640687, 0]
[           0, 0]
 
V =
[ 0.3333333333,  0.6666666667]
[ 0.6666666667, -0.6666666667]
[ 0.6666666667,  0.3333333333]

入力引数

すべて折りたたむ

シンボリック行列として指定される入力行列。出力引数が 1 つの構文の場合、A の要素にはシンボリック数、シンボリック変数、シンボリック式またはシンボリック関数を指定できます。出力引数が 3 つの構文の場合、A の要素は浮動小数点数に変換できなければなりません。

出力引数

すべて折りたたむ

行列の特異値。ベクトルとして返されます。sigma が数値のベクトルの場合、その要素は降順に並べ替えられます。

特異ベクトル。ユニタリ行列として返されます。この行列の各列は特異ベクトルです。

対角行列として返される特異値。この行列の対角要素は降順に並べられます。

特異ベクトル。ユニタリ行列として返されます。この行列の各列は特異ベクトルです。

ヒント

  • 2 番目の引数 0 および 'econ' は、返される行列の形状のみに影響します。これらの引数は計算性能に影響しません。

  • シンボリック オブジェクトではない数値行列について svd を呼び出すと、MATLAB® 関数 svd が呼び出されます。

  • 多くのシンボリック変数が含まれる行列計算は低速になる可能性があります。計算速度を向上させるには、特定の値を変数に代入することでシンボリック変数の数を減らします。

参考

| | | | | | |

トピック

R2006a より前に導入