|
|
◆ WZggsvd3()
| Function WZggsvd3 |
( |
Jobu As |
String, |
|
|
Jobv As |
String, |
|
|
Jobq As |
String, |
|
|
M As |
Long, |
|
|
N As |
Long, |
|
|
P As |
Long, |
|
|
A As |
Variant, |
|
|
B As |
Variant |
|
) |
| |
一般化特異値分解 (GSVD) (複素行列) (Excel複素数形式)
- 目的
- WZggsvd3はM×N複素行列 A および P×N複素行列 B の一般化特異値分解(GSVD)を求める.
U^H*A*Q = D1*(0 R), V^H*B*Q = D2*(0 R)
ここで, U, VおよびQはユニタリ行列である.
K+L = (A^H, B^H)^H の有効ランク数 とすると, R は (K+L)×(K+L)上三角行列, D1およびD2はそれぞれ M×(K+L) および P×(K+L)「対角」行列となり, 次のような構造をもつ.
M-K-L >= 0 の場合: K L
D1 = K (I 0)
L (0 C)
M-K-L (0 0)
K L
D2 = L (0 S)
P-L (0 0)
N-K-L K L
(0 R) = K ( 0 R11 R12)
L ( 0 0 R22)
ただし,
C = diag(Alpha(K), ... , Alpha(K+L-1)),
S = diag(Beta(K), ... , Beta(K+L-1)),
C^2 + S^2 = I.
終了時, R は A(0〜K+L-1, N-K-L〜N-1) に格納される.
M-K-L < 0 の場合: K M-K K+L-M
D1 = K (I 0 0)
M-K (0 C 0)
K M-K K+L-M
D2 = M-K (0 S 0)
K+L-M (0 0 I)
P-L (0 0 0)
N-K-L K M-K K+L-M
(0 R) = K ( 0 R11 R12 R13)
M-K ( 0 0 R22 R23)
K+L-M ( 0 0 0 R33)
ただし,
C = diag(Alpha(K), ... , Alpha(M-1)),
S = diag(Beta(K), ... , Beta(M-1)),
C^2 + S^2 = I
終了時, (R11 R12 R13) は A(0〜M-1, N-K-L〜N-1) に格納される. また, R33 は
( 0 R22 R23)
B(M-K〜L-1, N+M-K-L〜N-1) に格納される.
C, S, R および必要ならばユニタリ変換行列 U, V, Q が求められる.
Alpha()およびBeta()にAおよびBの一般化特異値が入る.
Alpha(0 to K-1) = 1,
Beta(0 to K-1) = 0,
M-K-L >= 0 の場合,
Alpha(K to K+L-1) = C,
Beta(K to K+L-1) = S,
M-K-L < 0 の場合,
Alpha(K to M-1)= C, Alpha(M to K+L-1) = 0,
Beta(K to M-1) = S, Beta(M to K+L-1) = 1,
また
Alpha(K+L to N-1) = 0,
Beta(K+L to N-1) = 0.
行列 B がN×N行列の場合, AとBのGSVDは暗黙のうちに A*inv(B) のSVDを与える. A*inv(B) = U*(D1*inv(D2))*V^H
(A^H,B^H)^H の列が正規直交であれば, AとBのGSVDはAとBのCS分解に等しい. さらに, GSVDを固有値問題を解くために使うことができる. 文献によってはAとBのGSVDを次のように表していることがある. U^H*A*X = (0 D1), V^H*B*X = (0 D2)
ここで, UとVはユニタリ行列で, Xは特異でないものとする. D1とD2は「対角」行列である. 非特異行列Xを次のようにとることにより, GSVDの前者の形式を後者の形式に変換することができる.
セル中で複素数を表現するためにExcelの複素数形式(例, 2.5+1i)を使用する. 複素数値はComplexワークシート関数を使って入力することができる.
- 戻り値
- N+1×K+L+2 (Jobu = "N", Jobv = "N", Jobq = "N" の場合)
| 列1 | 列2 | 列3〜K+L+2 |
| 行1〜N | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R |
| 行N+1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) |
max(M,N)+1×K+L+M+2 (Jobu = "U", Jobv = "N", Jobq = "N" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+M+2 |
| 行1〜max(M, N) | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | M×M ユニタリ行列 U |
| 行max(M, N) + 1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 |
max(N,P)+1×K+L+P+2 (Jobu = "N", Jobv = "V", Jobq = "N" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+P+2 |
| 行1〜max(N, P) | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | P×P ユニタリ行列 V |
| 行max(N, P) + 1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 |
N+1×K+L+N+2 (Jobu = "N", Jobv = "N", Jobq = "Q" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+N+2 |
| 行1〜N | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | N×N ユニタリ行列 Q |
| 行N+1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 |
max(M,N,P)+1×K+L+M+P+2 (Jobu = "U", Jobv = "V", Jobq = "N" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+M+2 | 列K+L+M+3〜K+L+M+P+2 |
| 行1〜max(M, N, P) | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | M×M ユニタリ行列 U | P×P ユニタリ行列 V |
| 行max(M, N, P) + 1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 | 0 |
max(M,N)+1×K+L+M+N+2 (Jobu = "U", Jobv = "N", Jobq = "Q" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+M+2 | 列K+L+M+3〜K+L+M+N+2 |
| 行1〜max(M, N) | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | M×M ユニタリ行列 U | N×N ユニタリ行列 Q |
| 行max(M, N) + 1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 | 0 |
max(N,P)+1×K+L+N+P+2 (Jobu = "N", Jobv = "V", Jobq = "Q" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+P+2 | 列K+L+P+3〜K+L+N+P+2 |
| 行1〜max(N, P) | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | P×P ユニタリ行列 V | N×N ユニタリ行列 Q |
| 行max(N, P) + 1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 | 0 |
max(M,N,P)+1×K+L+M+N+P+2 (Jobu = "U", Jobv = "V", Jobq = "Q" の場合)
| 列1 | 列2 | 列3〜K+L+2 | 列K+L+3〜K+L+M+2 | 列K+L+M+3〜K+L+M+P+2 | 列K+L+M+P+3〜K+L+M+N+P+2 |
| 行1〜max(M, N, P) | 一般化特異値 Alpha(j) (j = 1〜N) | 一般化特異値 Beta(j) (j = 1〜N) | K+L×K+L 上三角行列 R | M×M ユニタリ行列 U | P×P ユニタリ行列 V | N×N ユニタリ行列 Q |
| 行max(M, N, P) + 1 | リターンコード | サブブロックの次数K | サブブロックの次数L (列3) | 0 | 0 | 0 |
リターンコード.
= 0: 正常終了.
= 1: アルゴリズムが収束しなかった.
- 引数
-
| [in] | Jobu | = 'U': ユニタリ行列 U を求める.
= 'N': U を求めない. |
| [in] | Jobv | ='V': ユニタリ行列 V を求める.
= 'N': V を求めない. |
| [in] | Jobq | = "Q": ユニタリ行列 Q を求める.
= 'N': Q を求めない. |
| [in] | M | 行列 A の行数. (M >= 1) |
| [in] | N | 行列 A および B の列数. (N >= 1) |
| [in] | P | 行列 B の行数. (P >= 1) |
| [in] | A | (M×N) M×N 複素行列 A. |
| [in] | B | (P×N) P×N 複素行列 B. |
- 出典
- LAPACK
- 使用例
- 行列 A および 行列 B の一般化特異値分解(GSVD)を求める. ただし,
( 0.20-0.11i -0.93-0.32i 0.81+0.37i )
A = ( -0.80-0.92i -0.29+0.86i 0.64+0.51i )
( 0.71+0.59i -0.15+0.19i 0.20+0.94i )
( 0.57-0.91i -0.28-0.45i 0.25+0.91i )
B = ( 0.83+0.46i 0.63-0.19i -0.69+0.09i )
( 0.24-1.33i -0.56-0.67i 0.90+1.25i )
とする.
|