|
|
◆ 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 "V^H ="
Debug.Print "Info =", Info
End Sub
Function Cmplx(R As Double, Optional I As Double=0) As Complex 複素数の作成
Function Cimag(A As Complex) As Double 複素数の虚数部
Function Creal(A As Complex) As Double 複素数の実数部
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) (複素行列)
- 実行結果
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
|