|
|
◆ 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が返す). 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
|