Main Content

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) は、行列 A のエコノミーサイズの分解を返します。A が、mn 列の行列で、m > n である場合、svdU の最初の n 列のみを計算し、Snn 列の行列となります。m <= n の場合、この構文は svd(A) と等価です。

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

[___] = svd(___,outputForm) は、前述のいずれかの構文の入力または出力の引数を使用して、outputForm で指定した形式で特異値を返します。outputForm は、特異値を列ベクトルで返す場合は 'vector' とし、特異値を対角行列で返す場合は 'matrix' とします ("R2021b 以降")。

すべて折りたたむ

5 行 5 列のシンボリックな魔方陣の特異値を計算します。結果は列ベクトルとなります。

A = sym(magic(5));
sigma = svd(A)
sigma = 

(6551345+65655+5655-5565-1345)

または、'matrix' オプションを指定して、特異値を対角行列として返します。

S = svd(A,'matrix')
S = 

(650000051345+6500000655+500000655-500000565-1345)

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

syms t real
A = [0 1; -1 0];
E = expm(t*A)
E = 

(cos(t)sin(t)-sin(t)cos(t))

sigma = svd(E)
sigma = 

(cos(t)2+sin(t)2cos(t)2+sin(t)2)

結果を単純化します。

sigma = simplify(sigma)
sigma = 

(11)

計算を続けるため、t が実数であるという仮定を、syms を使用して再作成することで消去します。

syms t

6 次の魔方陣から 5 行 5 列のシンボリック行列を作成します。svd を使用して行列の特異値を計算します。

M = magic(6);
A = sym(M(1:5,1:5));
sigma = svd(A)
sigma = 

(root(σ1,z,5)root(σ1,z,4)root(σ1,z,3)root(σ1,z,2)root(σ1,z,1))where  σ1=z5-11357z4+26691022z3-17903673324z2+979310921328z-1676258447616

関数 svd は、シンボリック数で正確な特異値を見つけることができません。代わりに、関数 root でそれらを返します。

vpa を使用して特異値を数値的に近似します。

sigmaVpa = vpa(sigma)
sigmaVpa = 

(91.90338229938887559838064521710541.66752364570567794703813090238733.3893117613526255506073034298057.61386514813710461179507988708961.3299296132187199146053915272808)

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

old = digits(10);
A = sym(magic(5))
A = 

(17241815235714164613202210121921311182529)

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

(0.44721359550.54563487310.5116672736-0.1954395076-0.44975836320.44721359550.4497583632-0.19543950760.51166727360.54563487310.4472135955-1.547164189e-27-0.632455532-0.6324555321.213456644e-270.4472135955-0.4497583632-0.19543950760.5116672736-0.54563487310.4472135955-0.54563487310.5116672736-0.19543950760.4497583632)

S = 

(65.00000022.547088690000021.687425360000013.4035660000011.90078954)

V = 

(0.44721359550.40451643610.24656489620.66272600070.36927828660.44721359550.0055661597140.6627260007-0.2465648962-0.54769427410.4472135955-0.82016519161.767621593e-279.706484055e-280.35683197510.44721359550.005566159714-0.66272600070.2465648962-0.54769427410.44721359550.4045164361-0.2465648962-0.66272600070.3692782866)

digits(old)

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

vpa(U*S*V',10)
ans = 

(17.024.01.08.015.023.05.07.014.016.04.06.013.020.022.010.012.019.021.03.011.018.025.02.09.0)

方形行列の完全な分解とエコノミーサイズの分解を 8 桁の精度で計算します。

old = digits(8);
A = sym([1 2; 3 4; 5 6; 7 8])
A = 

(12345678)

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

(0.15248323-0.82264747-0.39450102-0.379959130.34991837-0.421375290.242796550.800655880.54735351-0.0201031030.69790998-0.461434360.744788650.38116908-0.54620550.040737612)

S = 

(14.269095000.626828230000)

V = 

(0.641423030.76718740.7671874-0.64142303)

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

(0.15248323-0.822647470.34991837-0.421375290.54735351-0.0201031030.744788650.38116908)

S = 

(14.269095000.62682823)

V = 

(0.641423030.76718740.7671874-0.64142303)

digits(old)

A は 4 行 2 列の行列なので、svd(A,'econ') が返す U の列数と S の行数は、完全な分解に比べて少なくなります。S 内のゼロの余分な行は、式 A = U*S*V' の中でそれらのゼロと乗算される U の対応する列とともに除外されます。

入力引数

すべて折りたたむ

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

R2021b 以降

特異値の出力形式。'vector' または 'matrix' として指定します。このオプションでは、特異値を列ベクトルと対角行列のどちらで返すかを指定できます。既定の動作は、以下のように、指定された出力の数によって異なります。

  • sigma = svd(A) のように出力を 1 つだけ指定した場合、特異値は既定で列ベクトルとして返されます。

  • [U,S,V] = svd(A) のように 3 つの出力を指定した場合、特異値は既定で対角行列 S として返されます。

出力引数

すべて折りたたむ

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

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

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

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

ヒント

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

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

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

バージョン履歴

R2006a より前に導入

すべて展開する

R2021b での動作変更

参考

| | | | | | |

トピック