Main Content

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

gsvd

特異値分解の一般化

説明

[U,V,X,C,S] = gsvd(A,B) は以下の関係を満たすユニタリ行列 UV、(通常) 正方行列 X、および非負対角行列 CS を返します。

A = U*C*X'
B = V*S*X'
C'*C + S'*S = I 

A および B は、列数が同じでなければなりませんが、行数は異なっていてもかまいません。Amp 列で Bnp 列の場合、Umm 列、Vnn 列、Xpq 列、Cmq 列、Snq 列になります。ここで、q = min(m+n,p) です。

S の非ゼロ要素は、常に主対角上にあります。C の非ゼロ要素は対角 diag(C,max(0,q-m)) 上にあります。m >= q の場合、これが C の主対角です。

[U,V,X,C,S] = gsvd(A,B,0) (Amp 列、Bnp 列) は、結果の U および Vp 列以下、C および Sp 行以下になるようにメモリ消費を抑えた分解を行います。一般化特異値は m >= p および n >= p である限り diag(C)./diag(S) です。

Amp 列で Bnp 列の場合、Ummin(q,m) 列、Vnmin(q,n) 列、Xpq 列、Cmin(q,m)q 列、Smin(q,n)q 列になります。ここで、q = min(m+n,p) です。

sigma = gsvd(A,B) は一般化特異値のベクトル sqrt(diag(C'*C)./diag(S'*S)) を返します。B が正方で正則の場合、一般化特異値 gsvd(A,B) は、通常特異値 svd(A/B) に対応しますが、これらは逆の順番で並べ替えされます。これらの逆数は gsvd(B,A) です。

ベクトル sigma は長さが q で非降順に並べられています。

例 1

行列は少なくとも列数と同じ行数をもちます。

A = reshape(1:15,5,3)
B = magic(3)
A =
         1     6    11
         2     7    12
         3     8    13
         4     9    14
         5    10    15
B =
         8     1     6
         3     5     7
         4     9     2

ステートメント

[U,V,X,C,S] = gsvd(A,B)

は、5 行 5 列の直交行列 U、3 行 3 列の直交行列 V、3 行 3 列の正則行列 X を返します。

X =
        2.8284   -9.3761   -6.9346
       -5.6569   -8.3071  -18.3301
        2.8284   -7.2381  -29.7256

および

C =
        0.0000         0         0
             0    0.3155         0
             0         0    0.9807
             0         0         0
             0         0         0
S =
        1.0000         0         0
             0    0.9489         0
             0         0    0.1957

A はランク落ちであるため、C の最初の対角要素はゼロです。

次のメモリ消費を抑えた分解

[U,V,X,C,S] = gsvd(A,B,0)

は、5 行 3 列の行列 U と 3 行 3 列の行列 C を返します。

U =
        0.5700   -0.6457   -0.4279
       -0.7455   -0.3296   -0.4375
       -0.1702   -0.0135   -0.4470
        0.2966    0.3026   -0.4566
        0.0490    0.6187   -0.4661

C =
        0.0000         0         0
             0    0.3155         0
             0         0    0.9807

他の 3 個の行列 VXS は、フル分解で得られた行列と同じです。

一般化特異値は、CS の対角要素の比です。

sigma = gsvd(A,B)
sigma =
        0.0000
        0.3325
        5.0123

これらの値は、通常の特異値を並べ替えたものです。

svd(A/B)
ans =
        5.0123
        0.3325
        0.0000

例 2

行列は少なくとも行数と同じ列数をもちます。

A = reshape(1:15,3,5)
B = magic(5)
A =

     1     4     7    10    13
     2     5     8    11    14
     3     6     9    12    15

B =

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19    21     3
    11    18    25     2     9

ステートメント

[U,V,X,C,S] = gsvd(A,B)

は、3 行 3 列の直交行列 U、5 行 5 列の直交行列 V、5 行 5 列の正則行列 X を返します。

C =

         0         0    0.0000         0         0
         0         0         0    0.0439         0
         0         0         0         0    0.7432

S =

    1.0000         0         0         0         0
         0    1.0000         0         0         0
         0         0    1.0000         0         0
         0         0         0    0.9990         0
         0         0         0         0    0.6690

この場合、C の非ゼロ対角は diag(C,2) です。一般化特異値は、3 個のゼロを含みます。

sigma = gsvd(A,B)
sigma =

         0
         0
    0.0000
    0.0439
    1.1109

AB の順番を逆にすると、3 つの値は逆数になり、2 つの無限大を返します。

gsvd(B,A)
ans =

   1.0e+16 *

    0.0000
    0.0000
    8.8252
       Inf
       Inf

ヒント

  • この関数 gsvd の式では、A または B の個々のランクに関する仮定は行われません。行列 X は、行列 [A;B] がフルランクである場合のみフルランクになります。実際、svd(X)cond(X) は、svd([A;B])cond([A;B]) と等価です。G. Golub and C. Van Loan [1] など、他の式では、null(A)null(B) がオーバーラップしないことが必要とされ、Xinv(X) または inv(X') で置き換えられます。

    しかし、null(A)null(B) がオーバーラップする場合には、CS の非ゼロ要素は一意には決定されません。

アルゴリズム

一般化特異値分解は、[1] で記述された C-S 分解、および組み込み関数 svd、関数 qr を使用します。C-S 分解は、関数 gsvd のプログラム ファイル内のローカル関数に実装されています。

参考文献

[1] Golub, Gene H. and Charles Van Loan, Matrix Computations, Third Edition, Johns Hopkins University Press, Baltimore, 1996

参考

|

R2006a より前に導入