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

◆ Dormlq()

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

LQ分解のQによる行列の乗算

目的
本ルーチンはm×n実行列Cを以下により上書きする.
Side = "L" Side = "R"
Trans = "N": Q * C C * Q
Trans = "T": Q^T * C C * Q^T
ただし, Qはk個の基本鏡映変換の積で定義される実直交行列である(Dgelqfが返す).
Q = H(k) . . . H(2) H(1)
Side = "L"の場合, Qは次数m. Side = "R"の場合, 次数nである.
引数
[in]Side= "L": Q または Q^T を左から適用する.
= "R": Q または Q^T を右から適用する.
[in]Trans= "N": 転置しない. Qを適用する.
= "T": 転置する. Q^Tを適用する.
[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) を定義するベクトルを入れる. これは, Dgelqfが配列引数A()の最初のK列に返したものである.
[in]Tau()配列 Tau(LTau - 1) (LTau >= K)
Dgelqfが返した鏡映変換のスカラー因子 H(i).
[in,out]C()配列 C(LC1 - 1, LC2 - 1) (LC1 >= M, LC2 >= N)
[in] M×N行列 C.
[out] C()は, Q*C または Q^T*C または C*Q^T または C*Q で上書きされる.
[out]Info= 0: 正常終了.
= -1: パラメータ Side の誤り. (Side <> "L"および"R")
= -2: パラメータ Trans の誤り. (Trans <> "T"および"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.11 -0.93 )
A = ( -0.32 0.81 0.37 )
( -0.80 -0.92 -0.29 )
である.
Sub Ex_Dormlq()
Const M = 3, N = 3, K = N
Dim A(M - 1, N - 1) As Double, Tau(N - 1) As Double, Info As Long
Dim L(M - 1, N - 1) As Double, I As Long, J As Long
A(0, 0) = 0.2: A(0, 1) = -0.11: A(0, 2) = -0.93
A(1, 0) = -0.32: A(1, 1) = 0.81: A(1, 2) = 0.37
A(2, 0) = -0.8: A(2, 1) = -0.92: A(2, 2) = -0.29
'-- Compute LQ factorization of A
Call Dgelqf(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 L(0, 0), L(0, 1), L(0, 2)
Debug.Print L(1, 0), L(1, 1), L(1, 2)
Debug.Print L(2, 0), L(2, 1), L(2, 2)
Debug.Print "Info =", Info
'-- Compute L*Q
Call Dormlq("R", "N", M, N, K, A(), Tau(), L(), Info)
Debug.Print "L*Q ="
Debug.Print L(0, 0), L(0, 1), L(0, 2)
Debug.Print L(1, 0), L(1, 1), L(1, 2)
Debug.Print L(2, 0), L(2, 1), L(2, 2)
Debug.Print "Info =", Info
End Sub
Sub Dgelqf(M As Long, N As Long, A() As Double, Tau() As Double, Info As Long)
LQ分解
Sub Dormlq(Side As String, Trans As String, M As Long, N As Long, K As Long, A() As Double, Tau() As Double, C() As Double, Info As Long)
LQ分解のQによる行列の乗算
実行結果
L =
-0.957601169589929 0 0
0.51921406926948 -0.791085804620857 0
-0.220237826244838 0.609478035393939 -1.07262846515618
Info = 0
L*Q =
0.2 -0.11 -0.93
-0.32 0.81 0.37
-0.8 -0.92 -0.29
Info = 0