XLPack 6.1
Excel VBA 数値計算ライブラリ・リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Zunmlq()

Sub Zunmlq ( Side As  String,
Trans As  String,
M As  Long,
N As  Long,
K As  Long,
A() As  Complex,
Tau() As  Complex,
C() As  Complex,
Info As  Long 
)

LQ分解のQによる行列の乗算 (複素行列)

目的
本ルーチンはm×n複素行列Cを以下により上書きする.
Side = "L" Side = "R"
Trans = "N": Q * C C * Q
Trans = "C": Q^H * C C * Q^H
ただし, Qはk個の基本鏡映変換の積で定義される複素ユニタリ行列である(Zgelqfが返す).
Q = H(k) . . . H(2) H(1)
Side = "L"の場合, Qは次数m. Side = "R"の場合, 次数nである.
引数
[in]Side= "L": Q または Q^H を左から適用する.
= "R": Q または Q^H を右から適用する.
[in]Trans= "N": 転置しない. Qを適用する.
= "C": 共役転置する. Q^Hを適用する.
[in]M行列 C の行数. (M >= 0) (M = 0 の場合, 処理を行わずに戻る)
[in]N行列 C の列数. (N >= 0) (N = 0 の場合, 処理を行わずに戻る)
[in]K積が行列Qを定義する基本鏡映変換の数. (M => K >= 0 (Side = "L"の場合), N >= K >= 0 (Side = "R"の場合)) (K = 0 の場合, 処理を行わずに戻る)
[in]A()配列 A(LA1 - 1, LA2 - 1) (LA1 >= K, LA2 >= M (Side = "L") または N (Side = "R"))
第i列に基本鏡映変換 H(i) (i = 1, 2, ..., K) を定義するベクトルを入れる. これは, Zgelqfが配列引数A()の最初のK列に返したものである.
[in]Tau()配列 Tau(LTau - 1) (LTau >= K)
Zgelqfが返した鏡映変換のスカラー因子 H(i).
[in,out]C()配列 C(LC1 - 1, LC2 - 1) (LC1 >= M, LC2 >= N)
[in] M×N行列 C.
[out] C()は, Q*C または Q^H*C または C*Q^H または C*Q で上書きされる.
[out]Info= 0: 正常終了.
= -1: パラメータ Side の誤り. (Side <> "L"および"R")
= -2: パラメータ Trans の誤り. (Trans <> "C"および"N")
= -3: パラメータ M の誤り. (M < 0)
= -4: パラメータ N の誤り. (N < 0)
= -5: パラメータ K の誤り. (K < 0 または K > M (Side = "L") または N (Side = "R"))
= -6: パラメータ A() の誤り.
= -7: パラメータ Tau() の誤り.
= -8: パラメータ C() の誤り.
出典
LAPACK
使用例
行列Aの行列AのLQ分解を求め, L*Qを計算する. ただし,
( 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_Zunmlq()
Const M = 3, N = 3, K = N
Dim A(M - 1, N - 1) As Complex, Tau(N - 1) As Complex, Info As Long
Dim L(M - 1, N - 1) As Complex, I As Long, J 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 Zgelqf(M, N, A(), Tau(), Info)
For I = 0 To M - 1
For J = 0 To I
L(I, J) = A(I, J)
Next
Next
Debug.Print "L ="
Debug.Print Creal(L(0, 0)), Cimag(L(0, 0))
Debug.Print Creal(L(1, 0)), Cimag(L(1, 0)), Creal(L(1, 1)), Cimag(L(1, 1))
Debug.Print Creal(L(2, 0)), Cimag(L(2, 0)), Creal(L(2, 1)), Cimag(L(2, 1))
Debug.Print Creal(L(2, 2)), Cimag(L(2, 2))
Debug.Print "Info =", Info
Call Zunmlq("R", "N", M, N, K, A(), Tau(), L(), Info)
Debug.Print "L*Q ="
Debug.Print Creal(L(0, 0)), Cimag(L(0, 0)), Creal(L(0, 1)), Cimag(L(0, 1)), Creal(L(0, 2)), Cimag(L(0, 2))
Debug.Print Creal(L(1, 0)), Cimag(L(1, 0)), Creal(L(1, 1)), Cimag(L(1, 1)), Creal(L(1, 2)), Cimag(L(1, 2))
Debug.Print Creal(L(2, 0)), Cimag(L(2, 0)), Creal(L(2, 1)), Cimag(L(2, 1)), Creal(L(2, 2)), Cimag(L(2, 2))
Debug.Print "Info =", Info
End Sub
実行結果
L =
-1.34625406220371 -0
-0.477473025372185 0.734111062500513 1.48758208444318 -0
-0.494408907417122 -0.489357854877404 -0.116513840695564 0.106275665633282
1.15135517107319 -0
Info = 0
L*Q =
0.2 -0.11 -0.93 -0.32 0.81 0.37
-0.8 -0.92 -0.29 0.86 0.64 0.51
0.71 0.59 -0.15 0.19 0.2 0.94
Info = 0