Main Content

svd

固定小数点の Golub-Kahan-Reinsch 特異値分解

R2022b 以降

説明

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

[U,S,V] = svd(A) は、A = U*S*V' となるように行列 A の特異値分解を実行します。S は、非負の対角要素を降順に並べた A と同じ次元の対角行列です。UV はユニタリ行列です。

[___] = svd(A,"econ") は、A のエコノミーサイズの分解を生成します。A が m 行 n 列の行列である場合、次のようになります。

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

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

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

[___] = svd(A,0) は、A についての異なるエコノミーサイズの分解を生成します。A が m 行 n 列の行列である場合、次のようになります。

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

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

この構文は推奨されません。代わりに "econ" オプションを使用してください。

[___] = svd(___,sigmaForm) は、特異値の出力形式をオプションで指定します。このオプションは、前述の任意の入力または出力の組み合わせで使用できます。特異値を列ベクトルとして返すには "vector" を指定します。特異値を対角行列として返すには "matrix" を指定します。

すべて折りたたむ

フル ランク固定小数点行列の特異値を計算します。

A = fi([1 0 1; -1 -2 0; 0 1 -1])
A = 
     1     0     1
    -1    -2     0
     0     1    -1

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 14

特異値を計算します。

s = svd(A)
s = 
    2.4605
    1.6996
    0.2392

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 16

特異値が列ベクトルで降順で返されます。

方形固定小数点行列 A の特異値分解を求めます。

方形行列 A を定義します。

m = 4;
n = 2;
rng('default');
A = fi(10*randn(m,n))
A = 
    5.3770    3.1875
   18.3389  -13.0771
  -22.5889   -4.3359
    8.6221    3.4258

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 10

固定小数点行列 A の特異値分解を求めます。

[U,S,V] = svd(A)
U = 
    0.1591    0.2717   -0.9387   -0.1403
    0.6397   -0.7548   -0.1219    0.0790
   -0.7049   -0.5057   -0.3224    0.3786
    0.2619    0.3174         0    0.9114

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30
S = 
   31.0148         0
         0   14.1290
         0         0
         0         0

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 16
V = 
    0.9920    0.1259
   -0.1259    0.9920

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30

関係 A = U*S*V' が成り立つことを確認します。

U*S*V'
ans = 
    5.3770    3.1873
   18.3390  -13.0773
  -22.5890   -4.3360
    8.6221    3.4257

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 99
        FractionLength: 76

方形固定小数点行列の完全な分解とエコノミーサイズの分解を計算します。

固定小数点行列 A を定義します。

m = 5;
n = 3;
rng('default');
A = fi(10*randn(m,n))
A = 
    5.3770  -13.0762  -13.4980
   18.3379   -4.3359   30.3496
  -22.5879    3.4258    7.2539
    8.6211   35.7832   -0.6309
    3.1875   27.6953    7.1465

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 9

完全な分解を計算します。

[U,S,V] = svd(A)
U = 
    0.3081   -0.0950    0.4507    0.7929    0.2534
   -0.1437    0.9533   -0.0877    0.2415   -0.0675
   -0.0224   -0.2106   -0.8423    0.4887   -0.0831
   -0.7299   -0.1909    0.2773    0.2722   -0.5290
   -0.5926   -0.0375   -0.0541         0    0.8028

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30
S = 
   48.4483         0         0
         0   36.6720         0
         0         0   26.9112
         0         0         0
         0         0         0

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 16
V = 
   -0.1786    0.5444    0.8196
   -0.9497   -0.3131    0.0009
   -0.2571    0.7783   -0.5729

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30

エコノミーサイズの分解を計算します。

[U,S,V] = svd(A,"econ")
U = 
    0.3081   -0.0950    0.4507
   -0.1437    0.9533   -0.0878
   -0.0224   -0.2106   -0.8423
   -0.7299   -0.1909    0.2773
   -0.5926   -0.0374   -0.0541

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30
S = 
   48.4485         0         0
         0   36.6720         0
         0         0   26.9112

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 16
V = 
   -0.1786    0.5444    0.8196
   -0.9497   -0.3131    0.0010
   -0.2571    0.7783   -0.5729

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30

想定される結果 A = U*S*V' を使用して、計算の相対誤差を求めます。

relativeError = norm(double(U*S*V'-A))/norm(double(A))
relativeError = 1.0359e-05

3 行 3 列の魔方陣行列を作成し、特異値分解を計算します。既定では、出力を複数指定した場合、関数 svd は特異値を対角行列で返します。

行列 A を定義します。

m = 3; 
n = m;
A = fi(magic(m))
A = 
     8     1     6
     3     5     7
     4     9     2

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 11

特異値分解を計算します。

[U,S,V] = svd(A)
U = 
    0.5774   -0.7071   -0.4083
    0.5773   -0.0000    0.8165
    0.5773    0.7071   -0.4082

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30
S = 
   15.0000         0         0
         0    6.9283         0
         0         0    3.4642

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 16
V = 
    0.5774   -0.4082   -0.7071
    0.5773    0.8165    0.0000
    0.5773   -0.4082    0.7071

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30

"vector" オプションを指定して、特異値を列ベクトルで返します。

[U,S,V] = svd(A,"vector")
U = 
    0.5774   -0.7071   -0.4083
    0.5773   -0.0000    0.8165
    0.5773    0.7071   -0.4082

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30
S = 
   15.0000
    6.9283
    3.4642

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 16
V = 
    0.5774   -0.4082   -0.7071
    0.5773    0.8165    0.0000
    0.5773   -0.4082    0.7071

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 32
        FractionLength: 30

S = svd(A) のように出力引数を 1 つ指定した場合、svd の動作が切り替わり、既定では列ベクトルで特異値が返されます。その場合は、"matrix" オプションを指定すると、特異値を対角行列として返すことができます。

入力引数

すべて折りたたむ

入力行列。行列として指定します。A は、固定小数点またはスケーリングされた double の fi データ型にすることができます。

データ型: fi
複素数のサポート: あり

特異値の出力形式。次の値のいずれかとして指定します。

  • "vector"S は列ベクトルになります。これは、S = svd(A) のように出力を 1 つ指定する場合の既定の動作です。

  • "matrix"S は対角行列になります。これは、[U,S,V] = svd(A) のように出力を複数指定する場合の既定の動作です。

例: [U,S,V] = svd(X,"vector") は、S を対角行列ではなく列ベクトルとして返します。

例: S = svd(X,"matrix") は、S を列ベクトルではなく対角行列として返します。

データ型: char | string

出力引数

すべて折りたたむ

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

固定小数点データ型は、オーバーフローの回避と精度の向上のために調整されます。詳細については、アルゴリズムを参照してください。

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

固定小数点データ型は、オーバーフローの回避と精度の向上のために調整されます。詳細については、アルゴリズムを参照してください。

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

固定小数点データ型は、オーバーフローの回避と精度の向上のために調整されます。詳細については、アルゴリズムを参照してください。

ヒント

固定小数点型を完全に制御するには、関数 fixed.svd を使用します。

アルゴリズム

すべて折りたたむ

データ型の伝播

関数 svd は、オーバーフローの回避と精度の向上のために固定小数点入力のデータ型を調整します。特異ベクトル S の小数部の長さは少なくとも 16 に調整され、語長はオーバーフローを回避するために少なくとも 32 に増やされます。左特異ベクトル U と右特異ベクトル V の語長は S の語長と同じです。UV の小数部の長さは語長よりも 2 短くなります。

Golub-Kahan-Reinsch

Golub-Kahan-Reinsch アルゴリズムは、シリアル コンピューターで良好に機能する逐次的な手法です。FPGA アプリケーションや ASIC アプリケーションでの並列計算には、関数 fixed.jacobiSVD を使用します。

拡張機能

バージョン履歴

R2022b で導入

参考

|

トピック