Main Content

svd

説明

S = svd(A) は、行列 A特異値を降順で返します。

[U,S,V] = svd(A) は、A = U*S*V' となるように、行列 A の特異値分解を実行します。

[___] = svd(A,"econ") は、前述の出力引数のいずれかの組み合わせを使用して、A のエコノミーサイズの分解を生成します。Amn 列の行列である場合、次のようになります。

  • m > nU の最初の n 列のみが計算され、Snn 列になります。

  • m = nsvd(A,"econ")svd(A) と等価です。

  • m < nV の最初の m 列のみが計算され、Smm 列になります。

エコノミーサイズの分解により、特異値の対角行列 S にある余分なゼロの行または列が、式 A = U*S*V' でこれらのゼロに乗算される U または V の列とともに削除されます。これらのゼロと列を削除すると、分解の精度を損なわずに、実行時間を改善してストレージ要件を低減することができます。

[___] = svd(A,0) は、mn 列の行列 A について、異なるエコノミーサイズの分解を出力します。

  • m > nsvd(A,0)svd(A,"econ") と等価です。

  • m <= nsvd(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

出力引数

すべて折りたたむ

左特異ベクトル。行列の列として返されます。

  • mn 列の行列 Am > n の場合、エコノミーサイズの分解 svd(A,"econ") は、U の最初の n 列のみを計算します。この場合、U の列は直交であり、UUHU=In を満たす mn 列の行列です。

  • 完全な分解の場合、svd(A)UUUH=UHU=Im を満たす mm 列のユニタリ行列として返します。非ゼロの特異値に対応する U の列は、A の値域に対応する一連の正規直交基底ベクトルを構成します。

マシンや MATLAB® のリリースが異なると、異なった特異ベクトルが生成されることがありますが、数値的にはいずれも正確です。UV の対応する列で符号が反転する場合がありますが、これは、反転しても式 A = U*S*V' の値には影響がないためです。

特異値。対角行列または列ベクトルとして返されます。特異値は非負であり、降順で返されます。

Amn 列の行列で、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 は異なる特異値を返す場合がありますが、これらの値は数値的にはいずれも正確です。

右特異ベクトル。行列の列として返されます。

  • mn 列の行列 Am < n の場合、エコノミー分解 svd(A,"econ") は、V の最初の m 列のみを計算します。この場合、V の列は直交であり、VVHV=Im を満たす nm 列の行列です。

  • 完全な分解の場合、svd(A)VVVH=VHV=In を満たす nn 列のユニタリ行列として返します。非ゼロの特異値に "対応しない" V の列は、A のヌル空間の一連の正規直交基底ベクトルを構成します。

マシンや MATLAB のリリースが異なると、異なった特異ベクトルが生成されることがありますが、数値的にはいずれも正確です。UV の対応する列で符号が反転する場合がありますが、これは、反転しても式 A = U*S*V' の値には影響がないためです。

拡張機能

バージョン履歴

R2006a より前に導入

すべて展開する

参考

| | | | | | |

トピック