ドキュメンテーション

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

svd

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

構文

  • sigma = svd(X)
  • [U,S,V] = svd(X)
  • [U,S,V] = svd(X,0)
  • [U,S,V] = svd(X,'econ')

説明

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

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

[U,S,V] = svd(X,0) は、"メモリ消費の少ない" 分解を行います。Xmn 列の行列で、m > n である場合、svdU の最初の n 列のみを計算します。この場合、Snn 列の行列です。m <= n の場合、この構文は svd(X) と等価です。

[U,S,V] = svd(X,'econ') も、"メモリ消費の少ない" 分解を行います。Xmn 列の行列で、m >= n である場合、この構文は svd(X,0) と等価です。m < n の場合、svdV の最初の m 列のみを計算します。この場合、Smm 列の行列です。

シンボリックな特異値

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

A = sym(magic(4));
sigma = svd(A)
sigma =
        34
 8*5^(1/2)
 2*5^(1/2)
         0

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

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

計算を続行するよう仮定を消去します。

syms t clear

浮動小数点の特異値

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

A = sym(magic(4));
sigma = svd(vpa(A))
sigma =
                                                     34.0
                         17.88854381999831757127338934985
                        4.4721359549995793928183473374626
 0.0000000000000000000042127245515076439434819165724023i

特異値と特異ベクトル

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

old = digits(10);
A = sym(magic(4))
[U, S, V] = svd(A)
digits(old)
A =
[ 16,  2,  3, 13]
[  5, 11, 10,  8]
[  9,  7,  6, 12]
[  4, 14, 15,  1]

U =
[ 0.5,  0.6708203932,  0.5, -0.2236067977]
[ 0.5, -0.2236067977, -0.5, -0.6708203932]
[ 0.5,  0.2236067977, -0.5,  0.6708203932]
[ 0.5, -0.6708203932,  0.5,  0.2236067977]
 
S =
[ 34.0,           0,           0,               0]
[    0, 17.88854382,           0,               0]
[    0,           0, 4.472135955,               0]
[    0,           0,           0, 1.108401846e-15]
 
V =
[ 0.5,  0.5,  0.6708203932,  0.2236067977]
[ 0.5, -0.5, -0.2236067977,  0.6708203932]
[ 0.5, -0.5,  0.2236067977, -0.6708203932]
[ 0.5,  0.5, -0.6708203932, -0.2236067977]

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

vpa(U*S*V',10)
ans =
[ 16.0,  2.0,  3.0, 13.0]
[  5.0, 11.0, 10.0,  8.0]
[  9.0,  7.0,  6.0, 12.0]
[  4.0, 14.0, 15.0,  1.0]

"メモリ消費の少ない" 分解

2 番目の入力引数 0 を使用して、23 列の行列を "メモリ消費の少ない" 分解によって計算します。

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 つの構文の場合、X の要素にはシンボリック数、シンボリック変数、シンボリック式またはシンボリック関数を指定できます。出力引数が 3 つの構文の場合、X の要素は浮動小数点数に変換できなければなりません。

出力引数

すべて折りたたむ

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

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

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

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

詳細

すべて折りたたむ

ヒント

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

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

参考

| | | | | | |

R2006a より前に導入

この情報は役に立ちましたか?