このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
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
— 入力行列
行列
入力行列。A
は、正方形または長方形のサイズにすることができます。
データ型: single
| double
複素数のサポート: あり
outputForm
— 特異値の出力形式
"vector"
| "matrix"
特異値の出力形式。次の値のいずれかとして指定します。
"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
出力引数
U
— 左特異ベクトル
行列
左特異ベクトル。行列の列として返されます。
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'
の値には影響がないためです。
S
— 特異値
対角行列 | 列ベクトル
特異値。対角行列または列ベクトルとして返されます。特異値は非負であり、降順で返されます。
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
は異なる特異値を返す場合がありますが、これらの値は数値的にはいずれも正確です。
V
— 右特異ベクトル
行列
右特異ベクトル。行列の列として返されます。
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'
の値には影響がないためです。
拡張機能
tall 配列
メモリの許容量を超えるような多数の行を含む配列を計算します。
使用上の注意事項および制限事項:
3 つの出力の構文
[U,S,V] = svd(X)
はサポートされていません。出力が 3 つの場合、svd(X,"econ")
の指定は必須です。必要に応じて、"vector"
または"matrix"
のオプションを指定できます。1 出力の
s = svd(X,...)
の場合、"econ"
を指定しない限り、特異値はベクトルとして返されます。
詳細については、tall 配列を参照してください。
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
使用上の注意事項および制限事項:
コード生成では、MATLAB が使用するものとは異なる
SVD
実装が使用されます。特異値分解が一意でないため、左および右特異ベクトルが MATLAB によって計算されたものと異なる場合があります。コード生成では、この関数のスパース行列入力はサポートされません。
GPU コード生成
GPU Coder™ を使用して NVIDIA® GPU のための CUDA® コードを生成します。
使用上の注意事項および制限事項:
コード生成では、MATLAB が使用するものとは異なる
SVD
実装が使用されます。特異値分解が一意でないため、左および右特異ベクトルが MATLAB によって計算されたものと異なる場合があります。入力行列に非有限値が含まれる場合、生成されたコードはエラーを発行しません。代わりに、出力には
NaN
値が含まれます。コード生成では、この関数のスパース行列入力はサポートされません。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
GPU 配列
Parallel Computing Toolbox™ を使用してグラフィックス処理装置 (GPU) 上で実行することにより、コードを高速化します。
関数 svd
は GPU 配列を完全にサポートしています。この関数を GPU で実行するには、入力データを gpuArray
(Parallel Computing Toolbox) として指定します。詳細については、GPU での MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
分散配列
Parallel Computing Toolbox™ を使用して、クラスターの結合メモリ上で大きなアレイを分割します。
使用上の注意事項および制限事項:
入力行列
A
が方形行列の場合、"econ"
オプションを使用してエコノミーサイズの分解を指定する必要があります。
詳細については、分散配列を使用した MATLAB 関数の実行 (Parallel Computing Toolbox)を参照してください。
バージョン履歴
R2006a より前に導入R2022b: エコノミーサイズの分解に "0" 構文は非推奨
構文 [___] = svd(A,0)
は引き続きサポートされますが、推奨されなくなりました。代わりに "econ"
オプションを使用して、エコノミーサイズの分解を実行してください。
R2021b: 出力形式の指定
outputForm
を "vector"
または "matrix"
に指定することで、svd
が出力引数をベクトルと行列のどちらとして返すかを制御します。分解が大規模な場合、出力をベクトルとして返すとメモリ消費量が少なくなり、効率性が向上します。
R2021b: svd
は非有限の入力に対して NaN
を返す
svd
は、入力に非有限の値 (Inf
または NaN
) が含まれていると NaN
値を返します。以前は、入力に非有限の値が含まれていると svd
からエラーがスローされていました。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)