|
|
◆ Zgesdd()
| Sub Zgesdd |
( |
Jobz As |
String, |
|
|
M As |
Long, |
|
|
N As |
Long, |
|
|
A() As |
Complex, |
|
|
S() As |
Double, |
|
|
U() As |
Complex, |
|
|
Vt() As |
Complex, |
|
|
Info As |
Long |
|
) |
| |
(分割統治法ドライバ) 特異値分解 (SVD) (複素行列)
- 目的
- 本ルーチンは M x N 複素行列 A の特異値分解(SVD), および, 必要により左および/または右特異ベクトルを求める. 固有ベクトルも求める場合, 分割統治法を使用する.
SVD は次のように表される. ここで, SIGMAはmin(M, N)個の対角要素を除き 0 の M x N 行列, U は M x M ユニタリ行列, V は N x N ユニタリ行列である. SIGMAの対角要素が A の特異値である. 特異値は非負の実数で, 降順に返される. U および V のはじめのmin(M, N)列は A の左および右特異ベクトルである.
本ルーチンでは V ではなく V^H を返すので注意せよ.
- 引数
-
| [in] | Jobz | 行列 U および V^H の全部あるいは一部を計算するか指定する.
= "A": U の M 列全ておよび V^H の N 行全てを配列 U() および Vt() に返す.
= "S": U のはじめのmin(M, N)列および V^H のはじめのmin(M, N)行を配列 U() および Vt() に返す.
= "O": M >= N の場合, U のはじめの N 列を配列 A() に上書きし, V^H のすべての行を配列 Vt() に返す. その他の場合, U のすべての列を配列 U() に返し, V^H のはじめの M 行を配列 A() に上書きする.
= "N": U の列および V^H の行を計算しない. |
| [in] | M | 入力行列 A の行数. (M >= 0) (M = 0 の場合, 処理を行わずに戻る) |
| [in] | N | 入力行列 A の列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る) |
| [in,out] | A() | 配列 A(LA1 - 1, LA2 - 1) (LA1 >= M, LA2 >= N)
[in] M x N 行列 A.
[out] Jobz = "O": M >= N の場合, A() は U(左特異ベクトル, 列ごとに格納)のはじめの N 列で上書きされる. その他の場合, A() は V^H(右特異ベクトル, 行ごとに格納)のはじめの M 行で上書きされる.
Jobz != "O": A() の内容は壊される. |
| [out] | S() | 配列 S(LS - 1) (LS >= min(M, N))
A の特異値 (S(i) >= S(i+1) となるように並べ替えられる). |
| [out] | U() | 配列 U(LU1 - 1, LU2 - 1) (LU1 >= M (Jobz = "S" または "A", または, Jobz = "O" かつ M < N の場合)) (LU2 >= M (Jobz = "A", または, Jobz = "O" かつ M < N の場合), LU2 >= min(M, N) (Jobz = "S" の場合))
Jobz = "A", または, Jobz = "O" かつ M < N: U() に M x M ユニタリ行列 U が入る.
Jobz = "S": U() に U(左特異ベクトル, 列ごとに格納)のはじめのmin(M, N)列が入る.
Jobz = "O" かつ M >= N, または, Jobz = "N": U() は参照されない. |
| [out] | Vt() | 配列 Vt(LVt1 - 1, LVt2 - 1) (LVt1 >= N (Jobz = "A", または, Jobz = "O" かつ M >= N の場合), LVt1 >= min(M, N) (Jobz = "S"の場合)) (LVt2 >= N (Jobz = "S" または "A", または, Jobz = "O" かつ M >= N の場合))
Jobz = "A", または, Jobz = "O" かつ M >= N: Vt() に N x N ユニタリ行列 V^H が入る.
Jobz = "S": Vt() に V^H(右特異ベクトル, 行ごとに格納)のはじめのmin(M, N)行が入る.
Jobz = "O" かつ M < N, または, Jobz = "N": Vt() は参照されない. |
| [out] | Info | = 0: 正常終了
= -1: パラメータ Jobz の誤り (Jobz != "A", "S", "O" および "N")
= -2: パラメータ M の誤り (M < 0)
= -3: パラメータ N の誤り (N < 0)
= -4: パラメータ A() の誤り.
= -5: パラメータ S() の誤り.
= -6: パラメータ U() の誤り.
= -7: パラメータ Vt() の誤り.
> 0: Dbdsdc が収束しなかった. 分割統治法の更新処理に失敗した. |
- 出典
- LAPACK
- 使用例
- 行列Aの特異値, 左および右特異ベクトルを求める. ただし,
( 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 )
である. Sub Ex_Zgesdd()
Const M = 3, N = 3
Dim A(M - 1, N - 1) As Complex, U(M - 1, N - 1) As Complex, Vt(N - 1, N - 1) As Complex
Dim S(N - 1) As Double, Info As Long
A(0, 0) = Cmplx(0.2, -0.11): A(0, 1) = Cmplx(-0.93, -0.32): A(0, 2) = Cmplx(0.81, 0.37)
A(1, 0) = Cmplx(-0.8, -0.92): A(1, 1) = Cmplx(-0.29, 0.86): A(1, 2) = Cmplx(0.64, 0.51)
A(2, 0) = Cmplx(0.71, 0.59): A(2, 1) = Cmplx(-0.15, 0.19): A(2, 2) = Cmplx(0.2, 0.94)
Call Zgesdd("S", M, N, A(), S(), U(), Vt(), Info)
Debug.Print "Singular values =", S(0), S(1), S(2)
Debug.Print "U ="
Debug.Print Creal(U(0, 0)), Cimag(U(0, 0)), Creal(U(0, 1)), Cimag(U(0, 1))
Debug.Print Creal(U(1, 0)), Cimag(U(1, 0)), Creal(U(1, 1)), Cimag(U(1, 1))
Debug.Print Creal(U(2, 0)), Cimag(U(2, 0)), Creal(U(2, 1)), Cimag(U(2, 1))
Debug.Print Creal(U(0, 2)), Cimag(U(0, 2))
Debug.Print Creal(U(1, 2)), Cimag(U(1, 2))
Debug.Print Creal(U(2, 2)), Cimag(U(2, 2))
Debug.Print "V^H ="
Debug.Print Creal(Vt(0, 0)), Cimag(Vt(0, 0)), Creal(Vt(0, 1)), Cimag(Vt(0, 1))
Debug.Print Creal(Vt(1, 0)), Cimag(Vt(1, 0)), Creal(Vt(1, 1)), Cimag(Vt(1, 1))
Debug.Print Creal(Vt(2, 0)), Cimag(Vt(2, 0)), Creal(Vt(2, 1)), Cimag(Vt(2, 1))
Debug.Print Creal(Vt(0, 2)), Cimag(Vt(0, 2))
Debug.Print Creal(Vt(1, 2)), Cimag(Vt(1, 2))
Debug.Print Creal(Vt(2, 2)), Cimag(Vt(2, 2))
Debug.Print "Info =", Info
End Sub
- 実行結果
Singular values = 2.07084030821889 1.23513084760163 0.901483337149816
U =
-0.322093837376809 0.402732043434636 9.95958553097357E-02 0.309610800223195
0.25572227156877 0.689932737910445 -0.631621088952191 3.70329357348019E-02
-0.438560869464762 1.80488745428176E-02 -7.00863751874234E-02 0.699280401316292
0.711819740685389 -0.348707521966052
-9.32902099996817E-02 0.222663951646943
-0.55115638604919 -0.098285606104146
V^H =
-0.603023132575377 0 0.366551261475641 0.394522570687146
0.663818465313821 0 0.134961467338043 -0.149629139353428
-0.44238913491109 0 -0.297134277147366 -0.762299060909463
0.16075433957414 -0.566138903287951
0.366911928609536 -0.61977189734833
0.331437452593181 -0.15827959884907
Info = 0
|