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

◆ Zgelqf()

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

LQ分解 (複素行列)

目的
本ルーチンはm×n複素行列AのLQ分解を計算する.
A = L * Q
引数
[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] 対角およびその下の要素にM×min(M, N)下台形行列Lが入る(M <= Nであれば, Lは下三角行列である). 対角より上の要素は, 配列Tau()と合わせて, 基本鏡映変換の積としてユニタリ行列Qを表す (詳細を参照のこと).
[out]Tau()配列 Tau(LTau - 1) (LTau >= min(M, N))
基本鏡映変換のスカラー因子 (詳細を参照のこと).
[out]Info= 0: 正常終了.
= -1: パラメータ M の誤り. (M < 0)
= -2: パラメータ N の誤り. (N < 0)
= -3: パラメータ A() の誤り.
= -4: パラメータ Tau() の誤り.
詳細
行列Qは基本鏡映変換の積で表される.
Q = H(k) . . . H(2) H(1), ただし k = min(M, N).
各H(i)は次のように表される.
H(i) = I - tau * v * v^H
ただし, tauは複素スカラー, また, vは複素ベクトルで, v(1〜i-1) = 0, v(i) = 1 である. v(i+1〜N)はA(i-1, i〜N-1)に, tauはTau(i-1)に格納される.
出典
LAPACK
使用例
行列Aの行列AのLQ分解を求める. ただし,
( 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_Zgelqf()
Const M = 3, N = 3, K = N
Dim A(M - 1, N - 1) As Complex, Tau(N - 1) As Complex, 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 Zgelqf(M, N, A(), Tau(), Info)
Debug.Print "L ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0))
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(2, 2)), Cimag(A(2, 2))
Debug.Print "Info =", Info
Call Zunglq(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 Zgelqf(M As Long, N As Long, A() As Complex, Tau() As Complex, Info As Long)
LQ分解 (複素行列)
Sub Zunglq(M As Long, N As Long, K As Long, A() As Complex, Tau() As Complex, Info As Long)
LQ分解の行列Qの生成 (複素行列)
実行結果
L =
-1.34625406220371 -0
-0.477473025372185 0.734111062500513 1.48758208444318 -0
-0.494408907417122 -0.489357854877404 -0.116513840695564 0.106275665633282
1.15135517107319 -0
Info = 0
Q =
-0.148560368815241 8.17082028483825E-02 0.69080571499087 0.237696590104386
-0.545146840380333 -0.518913702352619 0.144084009371217 0.313505787318611
0.415076807108814 0.482191168043502 0.108852269075227 0.579131158086946
-0.601669493701726 -0.274836682308196
0.101479037213067 0.551542760356437
9.33352464525714E-02 0.489131616930332
Info = 0