svd
特異値分解
説明
[___] = svd( は、前述の出力引数のいずれかの組み合わせを使用して、A,"econ")A のエコノミーサイズの分解を生成します。A が m 行 n 列の行列である場合、次のようになります。
m > n—Uの最初のn列のみが計算され、Sはn行n列になります。m = n—svd(A,"econ")はsvd(A)と等価です。m < n—Vの最初のm列のみが計算され、Sはm行m列になります。
エコノミーサイズの分解により、特異値の対角行列 S にある余分なゼロの行または列が、式 A = U*S*V' でこれらのゼロに乗算される U または V の列とともに削除されます。これらのゼロと列を削除すると、分解の精度を損なわずに、実行時間を改善してストレージ要件を低減することができます。
[___] = svd( は、A,0)m 行 n 列の行列 A について、異なるエコノミーサイズの分解を出力します。
m > n—svd(A,0)はsvd(A,"econ")と等価です。m <= n—svd(A,0)はsvd(A)と等価です。
この構文の使用は推奨されません。代わりに "econ" オプションを使用してください。
[___] = svd(___, は、特異値の出力形式をオプションで指定します。このオプションは、前述のすべての入力引数または出力引数の組み合わせで使用できます。特異値を列ベクトルとして返す場合は outputForm)"vector"、特異値を対角行列として返す場合は "matrix" を指定します。
例
フル ランク行列の特異値を計算します。
A = [1 0 1; -1 -2 0; 0 1 -1]
A = 3×3
1 0 1
-1 -2 0
0 1 -1
s = svd(A)
s = 3×1
2.4605
1.6996
0.2391
方形行列 A の特異値分解を求めます。
A = [1 2; 3 4; 5 6; 7 8]
A = 4×2
1 2
3 4
5 6
7 8
[U,S,V] = svd(A)
U = 4×4
-0.1525 -0.8226 -0.3945 -0.3800
-0.3499 -0.4214 0.2428 0.8007
-0.5474 -0.0201 0.6979 -0.4614
-0.7448 0.3812 -0.5462 0.0407
S = 4×2
14.2691 0
0 0.6268
0 0
0 0
V = 2×2
-0.6414 0.7672
-0.7672 -0.6414
マシンの精度内で A = U*S*V' が成り立つことを確認します。
U*S*V'
ans = 4×2
1.0000 2.0000
3.0000 4.0000
5.0000 6.0000
7.0000 8.0000
方形行列の完全な分解とエコノミーサイズの分解を計算します。
A = [1 2; 3 4; 5 6; 7 8]
A = 4×2
1 2
3 4
5 6
7 8
[U,S,V] = svd(A)
U = 4×4
-0.1525 -0.8226 -0.3945 -0.3800
-0.3499 -0.4214 0.2428 0.8007
-0.5474 -0.0201 0.6979 -0.4614
-0.7448 0.3812 -0.5462 0.0407
S = 4×2
14.2691 0
0 0.6268
0 0
0 0
V = 2×2
-0.6414 0.7672
-0.7672 -0.6414
[U,S,V] = svd(A,"econ")U = 4×2
-0.1525 -0.8226
-0.3499 -0.4214
-0.5474 -0.0201
-0.7448 0.3812
S = 2×2
14.2691 0
0 0.6268
V = 2×2
-0.6414 0.7672
-0.7672 -0.6414
A は 4 行 2 列なので、svd(A,"econ") は完全な分解と比較して少ない列を U に、少ない行を S にそれぞれ返します。S の余分なゼロの行が、式 A = U*S*V' でこれらのゼロに乗算される U の対応列とともに削除されます。
6 行 6 列の魔方陣行列を作成し、SVD を計算します。既定では、出力を複数指定した場合、svd は特異値を対角行列として返します。
A = magic(6); [U,S,V] = svd(A)
U = 6×6
-0.4082 0.5574 0.0456 -0.4182 0.3092 0.5000
-0.4082 -0.2312 0.6301 -0.2571 -0.5627 0.0000
-0.4082 0.4362 0.2696 0.5391 0.1725 -0.5000
-0.4082 -0.3954 -0.2422 -0.4590 0.3971 -0.5000
-0.4082 0.1496 -0.6849 0.0969 -0.5766 0.0000
-0.4082 -0.5166 -0.0182 0.4983 0.2604 0.5000
S = 6×6
111.0000 0 0 0 0 0
0 50.6802 0 0 0 0
0 0 34.3839 0 0 0
0 0 0 10.1449 0 0
0 0 0 0 5.5985 0
0 0 0 0 0 0.0000
V = 6×6
-0.4082 0.6234 -0.3116 0.2495 0.2511 0.4714
-0.4082 -0.6282 0.3425 0.1753 0.2617 0.4714
-0.4082 -0.4014 -0.7732 -0.0621 -0.1225 -0.2357
-0.4082 0.1498 0.2262 -0.4510 0.5780 -0.4714
-0.4082 0.1163 0.2996 0.6340 -0.3255 -0.4714
-0.4082 0.1401 0.2166 -0.5457 -0.6430 0.2357
"vector" オプションを指定して、特異値を列ベクトルで返します。
[U,S,V] = svd(A,"vector")U = 6×6
-0.4082 0.5574 0.0456 -0.4182 0.3092 0.5000
-0.4082 -0.2312 0.6301 -0.2571 -0.5627 0.0000
-0.4082 0.4362 0.2696 0.5391 0.1725 -0.5000
-0.4082 -0.3954 -0.2422 -0.4590 0.3971 -0.5000
-0.4082 0.1496 -0.6849 0.0969 -0.5766 0.0000
-0.4082 -0.5166 -0.0182 0.4983 0.2604 0.5000
S = 6×1
111.0000
50.6802
34.3839
10.1449
5.5985
0.0000
V = 6×6
-0.4082 0.6234 -0.3116 0.2495 0.2511 0.4714
-0.4082 -0.6282 0.3425 0.1753 0.2617 0.4714
-0.4082 -0.4014 -0.7732 -0.0621 -0.1225 -0.2357
-0.4082 0.1498 0.2262 -0.4510 0.5780 -0.4714
-0.4082 0.1163 0.2996 0.6340 -0.3255 -0.4714
-0.4082 0.1401 0.2166 -0.5457 -0.6430 0.2357
S = svd(A) のように出力引数を 1 つ指定した場合、svd の動作が切り替わり、既定では列ベクトルで特異値が返されます。その場合は、"matrix" オプションを指定すると、特異値を対角行列として返すことができます。
特異値分解の結果を使用して、行列のランク、列空間およびヌル空間を求めます。
A = [2 0 2; 0 1 0; 0 0 0]
A = 3×3
2 0 2
0 1 0
0 0 0
[U,S,V] = svd(A)
U = 3×3
1 0 0
0 1 0
0 0 1
S = 3×3
2.8284 0 0
0 1.0000 0
0 0 0
V = 3×3
0.7071 0 0.7071
0 1.0000 0
0.7071 0 -0.7071
非ゼロの特異値の数を使用してランクを計算します。
s = diag(S); rank_A = nnz(s)
rank_A = 2
非ゼロの特異値に対応する U の列を使用して、A の列空間の正規直交基底を計算します。
column_basis = U(:,logical(s))
column_basis = 3×2
1 0
0 1
0 0
ゼロに等しい特異値に対応する V の列を使用して、A のヌル空間の正規直交基底を計算します。
null_basis = V(:,~s)
null_basis = 3×1
0.7071
0
-0.7071
関数 rank、関数 orth および関数 null は、これらの量を計算するための便利な方法です。
入力引数
入力行列。A は、正方形または長方形のサイズにすることができます。
データ型: single | double
複素数のサポート: あり
特異値の出力形式。次の値のいずれかとして指定します。
"vector"—Sは列ベクトルになります。これは、S = svd(X)のように出力を 1 つ指定する場合の既定の動作です。"matrix"—Sは対角行列になります。これは、[U,S,V] = svd(X)のように出力を複数指定する場合の既定の動作です。
例: [U,S,V] = svd(X,"vector") は、S を対角行列ではなく列ベクトルとして返します。
例: S = svd(X,"matrix") は、S を列ベクトルではなく対角行列として返します。
データ型: char | string
出力引数
左特異ベクトル。行列の列として返されます。
m行n列の行列Aでm > nの場合、エコノミーサイズの分解svd(A,"econ")は、Uの最初のn列のみを計算します。この場合、Uの列は直交であり、Uは を満たすm行n列の行列です。完全な分解の場合、
svd(A)はUを を満たすm行m列のユニタリ行列として返します。非ゼロの特異値に対応するUの列は、Aの値域に対応する一連の正規直交基底ベクトルを構成します。
マシンや MATLAB® のリリースが異なると、異なった特異ベクトルが生成されることがありますが、数値的にはいずれも正確です。U と V の対応する列で符号が反転する場合がありますが、これは、反転しても式 A = U*S*V' の値には影響がないためです。
特異値。対角行列または列ベクトルとして返されます。特異値は非負であり、降順で返されます。
A が m 行 n 列の行列で、S が対角行列の場合、S のサイズは次のようになります。
エコノミーサイズの分解
svd(A,"econ")は、次数min([m,n])の正方行列Sを返します。完全な分解の場合、
svd(A)はAと同じサイズのSを返します。
さらに、S の特異値は、svd の呼び出し方法と outputForm オプションの指定に応じて列ベクトルまたは対角行列のいずれかとして返されます。
svdの呼び出しで出力を 1 つ指定した場合または"vector"オプションを指定した場合、Sは列ベクトルになります。svdの呼び出しで出力を複数指定した場合または"matrix"オプションを指定した場合、Sは対角行列になります。
指定する出力が 1 つであるか複数であるかによって、svd は異なる特異値を返す場合がありますが、これらの値は数値的にはいずれも正確です。
右特異ベクトル。行列の列として返されます。
m行n列の行列Aでm < nの場合、エコノミー分解svd(A,"econ")は、Vの最初のm列のみを計算します。この場合、Vの列は直交であり、Vは を満たすn行m列の行列です。完全な分解の場合、
svd(A)はVを を満たすn行n列のユニタリ行列として返します。非ゼロの特異値に "対応しない"Vの列は、Aのヌル空間の一連の正規直交基底ベクトルを構成します。
マシンや MATLAB のリリースが異なると、異なった特異ベクトルが生成されることがありますが、数値的にはいずれも正確です。U と V の対応する列で符号が反転する場合がありますが、これは、反転しても式 A = U*S*V' の値には影響がないためです。
拡張機能
svd 関数は tall 配列をサポートしていますが、以下の使用上の注意および制限があります。
3 つの出力の構文
[U,S,V] = svd(X)はサポートされていません。出力が 3 つの場合、svd(X,"econ")の指定は必須です。必要に応じて、"vector"または"matrix"のオプションを指定できます。1 出力の
s = svd(X,...)の場合、"econ"を指定しない限り、特異値はベクトルとして返されます。
詳細については、tall 配列を参照してください。
使用上の注意および制限:
コード生成では、MATLAB が使用するものとは異なる
SVD実装が使用されます。特異値分解が一意でないため、左および右特異ベクトルが MATLAB によって計算されたものと異なる場合があります。コード生成では、この関数のスパース行列入力はサポートされません。
使用上の注意および制限:
コード生成では、MATLAB が使用するものとは異なる
SVD実装が使用されます。特異値分解が一意でないため、左および右特異ベクトルが MATLAB によって計算されたものと異なる場合があります。入力行列に非有限値が含まれる場合、生成されたコードはエラーを発行しません。代わりに、出力には
NaN値が含まれます。コード生成では、この関数のスパース行列入力はサポートされません。
svd 関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
svd 関数は、GPU 配列を完全にサポートします。GPU 上で関数を実行するには、入力データを gpuArray (Parallel Computing Toolbox) として指定します。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
svd 関数は分散配列をサポートしますが、次の使用上の注意および制限があります。
入力行列
Aが方形行列の場合、"econ"オプションを使用してエコノミーサイズの分解を指定する必要があります。
詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入構文 [___] = svd(A,0) は引き続きサポートされますが、推奨されなくなりました。代わりに "econ" オプションを使用して、エコノミーサイズの分解を実行してください。
outputForm を "vector" または "matrix" に指定することで、svd が出力引数をベクトルと行列のどちらとして返すかを制御します。分解が大規模な場合、出力をベクトルとして返すとメモリ消費量が少なくなり、効率性が向上します。
svd は、入力に非有限の値 (Inf または NaN) が含まれていると NaN 値を返します。以前は、入力に非有限の値が含まれていると svd からエラーがスローされていました。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)