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

svd

説明

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

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

[U,S,V] = svd(A,'econ') は、mn 列の行列 A について、エコノミーサイズの分解を出力します。

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

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

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

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

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

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

  • m <= nsvd(A,0)svd(A) と等価です。

すべて折りたたむ

フル ランク行列の特異値を計算します。

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 の対応列とともに削除されます。

特異値分解の結果を使用して、行列のランク、列空間およびヌル空間を求めます。

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
複素数のサポート: あり

出力引数

すべて折りたたむ

特異値。列ベクトルとして返されます。特異値は、非負の実数値であり、降順でリストされます。

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

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

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

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

特異値。対角行列として返されます。S の対角要素は、降順に並べられた非負の特異値です。S のサイズは次のとおりです。

  • mn 列の行列 A の場合、エコノミーサイズの分解 svd(A,'econ') は、次数 min([m,n]) の正方行列 S を返します。

  • 完全な分解の場合、svd(A)A と同じサイズの S を返します。

  • m > n の場合、svd(A,0) は次数 min([m,n]) の正方行列 S を返します。

  • m < n の場合、svd(A,0)A と同じサイズの S を返します。

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

  • 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 より前に導入