このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
gsvd
特異値分解の一般化
説明
[U,V,X,C,S] = gsvd(A,B)
は以下の関係を満たすユニタリ行列 U
と V
、(通常) 正方行列 X
、および非負対角行列 C
と S
を返します。
A = U*C*X' B = V*S*X' C'*C + S'*S = I
A
および B
は、列数が同じでなければなりませんが、行数は異なっていてもかまいません。A
が m
行 p
列で B
が n
行 p
列の場合、U
は m
行 m
列、V
は n
行 n
列、X
は p
行 q
列、C
は m
行 q
列、S
は n
行 q
列になります。ここで、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)
(A
は m
行 p
列、B
は n
行 p
列) は、結果の U
および V
が p
列以下、C
および S
が p
行以下になるようにメモリ消費を抑えた分解を行います。一般化特異値は m >= p
および n >= p
である限り diag(C)./diag(S)
です。
A
が m
行 p
列で B
が n
行 p
列の場合、U
は m
行 min(q,m)
列、V
は n
行 min(q,n)
列、X
は p
行 q
列、C
は min(q,m)
行 q
列、S
は min(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 個の行列 V
、X
、S
は、フル分解で得られた行列と同じです。
一般化特異値は、C
と S
の対角要素の比です。
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
A
と B
の順番を逆にすると、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)
がオーバーラップしないことが必要とされ、X
はinv(X)
またはinv(X')
で置き換えられます。しかし、
null(A)
とnull(B)
がオーバーラップする場合には、C
とS
の非ゼロ要素は一意には決定されません。
アルゴリズム
一般化特異値分解は、[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