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

◆ Zgeqp3()

Sub Zgeqp3 ( M As  Long,
N As  Long,
A() As  Complex,
Jpvt() As  Long,
Tau() As  Complex,
Info As  Long 
)

QR分解 (ピボット選択付き) (複素行列)

目的
本ルーチンは行列AのQR分解をピボット選択付きで計算する.
A * P = Q * R
計算にはレベル3 BLASを用いる.
引数
[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×N行列 A.
[out] 上三角部分にmin(M, N)×N上台形行列Rが入る. 対角下の要素は, 配列Tau()と合わせて, min(M, N)個の基本鏡映変換の積としてユニタリ行列Qを表す.
[in,out]Jpvt()配列 Jpvt(LJpvt - 1) (LJpvt >= N)
[in] Jpvt(j-1) <> 0 の場合, Aの第j列はA*Pの前(先頭列)に入れ替えられる. Jpvt(j-1) = 0 の場合, Aの第j列はフリーな列である.
[out] Jpvt(j-1) = k の場合, A*Pの第j列は第k列であったことを示す.
[out]Tau()配列 Tau(LTau - 1) (LTau >= min(M, N))
基本鏡映変換のスカラー因子.
[out]Info= 0: 正常終了.
= -1: パラメータ M の誤り. (M < 0)
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ A() の誤り.
= -4: パラメータ Jpvt() の誤り.
= -5: パラメータ Tau() の誤り.
出典
LAPACK
使用例
行列Aの行列AのQR分解を求める. ただし,
( 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_Zgeqp3()
Const M = 3, N = 3, K = N
Dim A(M - 1, N - 1) As Complex, Jpvt(N - 1) As Long, Tau(N - 1) As Complex
Dim Info As Long, I 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)
For I = 0 To N - 1
Jpvt(I) = 1
Next
Call Zgeqp3(M, N, A(), Jpvt(), Tau(), Info)
Debug.Print "R ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0)), Creal(A(0, 1)), Cimag(A(0, 1))
Debug.Print Creal(A(0, 2)), Cimag(A(0, 2))
Debug.Print Creal(A(1, 1)), Cimag(A(1, 1)), Creal(A(1, 2)), Cimag(A(1, 2))
Debug.Print Creal(A(2, 2)), Cimag(A(2, 2))
Debug.Print "Jpvt =", Jpvt(0), Jpvt(1), Jpvt(2)
Debug.Print "Info =", Info
Call Zungqr(M, N, K, A(), Tau(), Info)
Debug.Print "Q ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0)), Creal(A(0, 1)), Cimag(A(0, 1))
Debug.Print Creal(A(1, 0)), Cimag(A(1, 0)), Creal(A(1, 1)), Cimag(A(1, 1))
Debug.Print Creal(A(2, 0)), Cimag(A(2, 0)), Creal(A(2, 1)), Cimag(A(2, 1))
Debug.Print Creal(A(0, 2)), Cimag(A(0, 2))
Debug.Print Creal(A(1, 2)), Cimag(A(1, 2))
Debug.Print Creal(A(2, 2)), Cimag(A(2, 2))
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 Zgeqp3(M As Long, N As Long, A() As Complex, Jpvt() As Long, Tau() As Complex, Info As Long)
QR分解 (ピボット選択付き) (複素行列)
Sub Zungqr(M As Long, N As Long, K As Long, A() As Complex, Tau() As Complex, Info As Long)
QR分解の行列Qの生成 (複素行列)
実行結果
R =
-1.54618886297891 0 0.455571771900423 0.580588841049134
0.105614523497074 -0.57774313435356
1.14235325460067 0 -0.16000635361559 -0.558214300362838
1.30543219081149 0
Jpvt = 1 2 3
Info = 0
Q =
-0.129350304344243 7.11426673893335E-02 -0.726366393673366 -0.242754372725663
0.517401217376971 0.595011399983517 -0.157793930669391 0.252577062211036
-0.459193580422062 -0.381583397815516 -0.142116660471961 0.551879456556921
0.614237041991267 -0.119926029506194
5.77211185374505E-02 0.535006158572045
0.105825585638305 0.554588344523916
Info = 0