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

◆ Dormqr()

Sub Dormqr ( 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 
)

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

目的
本ルーチンはm×n実行列Cを以下により上書きする.
Side = "L" Side = "R"
Trans = "N": Q * C C * Q
Trans = "T": Q^T * C C * Q^T
ただし, Qはk個の基本鏡映変換の積で定義される実直交行列である(Dgeqrfが返す).
Q = H(1) H(2) . . . H(k)
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 >= M (Side = "L") または N (Side = "R"), LA2 >= K)
第i列に基本鏡映変換 H(i) (i = 1, 2, ..., K) を定義するベクトルを入れる. これは, Dgeqrfが配列引数A()の最初のK列に返したものである.
[in]Tau()配列 Tau(LTau - 1) (LTau >= K)
Dgeqrfが返した鏡映変換のスカラー因子 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のQR分解を求め, Q*Rを計算する. ただし,
( 0.20 -0.11 -0.93 )
A = ( -0.32 0.81 0.37 )
( -0.80 -0.92 -0.29 )
である.
Sub Ex_Dormqr()
Const M = 3, N = 3, K = N
Dim A(M - 1, N - 1) As Double, Tau(N - 1) As Double, Info As Long
Dim R(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 QR factorization of A
Call Dgeqrf(M, N, A(), Tau(), Info)
For I = 0 To M - 1
For J = I To N - 1
R(I, J) = A(I, J)
Next
Next
Debug.Print "R ="
Debug.Print R(0, 0), R(0, 1), R(0, 2)
Debug.Print R(1, 0), R(1, 1), R(1, 2)
Debug.Print R(2, 0), R(2, 1), R(2, 2)
Debug.Print "Info =", Info
'-- Compute Q*R
Call Dormqr("L", "N", M, N, K, A(), Tau(), R(), Info)
Debug.Print "Q*R ="
Debug.Print R(0, 0), R(0, 1), R(0, 2)
Debug.Print R(1, 0), R(1, 1), R(1, 2)
Debug.Print R(2, 0), R(2, 1), R(2, 2)
Debug.Print "Info =", Info
End Sub
Sub Dormqr(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)
QR分解のQによる行列の乗算
Sub Dgeqrf(M As Long, N As Long, A() As Double, Tau() As Double, Info As Long)
QR分解
実行結果
R =
-0.884533775499839 -0.514169173181655 8.18510293279503E-02
0 -1.11813687057967 -0.635776616242947
0 0 -0.821576839520579
Info = 0
Q*R =
0.2 -0.11 -0.93
-0.32 0.81 0.37
-0.8 -0.92 -0.29
Info = 0