Annotation of rpl/lapack/lapack/dgelqt3.f, revision 1.5
1.1 bertrand 1: *> \brief \b DGELQT3 recursively computes a LQ factorization of a general real or complex matrix using the compact WY representation of Q.
2: *
3: * =========== DOCUMENTATION ===========
4: *
5: * Online html documentation available at
6: * http://www.netlib.org/lapack/explore-html/
7: *
8: *> \htmlonly
1.5 ! bertrand 9: *> Download DGELQT3 + dependencies
1.1 bertrand 10: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgelqt3.f">
11: *> [TGZ]</a>
12: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgelqt3.f">
13: *> [ZIP]</a>
14: *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgelqt3.f">
15: *> [TXT]</a>
16: *> \endhtmlonly
17: *
18: * Definition:
19: * ===========
20: *
21: * RECURSIVE SUBROUTINE DGELQT3( M, N, A, LDA, T, LDT, INFO )
22: *
23: * .. Scalar Arguments ..
24: * INTEGER INFO, LDA, M, N, LDT
25: * ..
26: * .. Array Arguments ..
27: * DOUBLE PRECISION A( LDA, * ), T( LDT, * )
28: * ..
29: *
30: *
31: *> \par Purpose:
32: * =============
33: *>
34: *> \verbatim
35: *>
36: *> DGELQT3 recursively computes a LQ factorization of a real M-by-N
37: *> matrix A, using the compact WY representation of Q.
38: *>
39: *> Based on the algorithm of Elmroth and Gustavson,
40: *> IBM J. Res. Develop. Vol 44 No. 4 July 2000.
41: *> \endverbatim
42: *
43: * Arguments:
44: * ==========
45: *
46: *> \param[in] M
47: *> \verbatim
48: *> M is INTEGER
49: *> The number of rows of the matrix A. M =< N.
50: *> \endverbatim
51: *>
52: *> \param[in] N
53: *> \verbatim
54: *> N is INTEGER
55: *> The number of columns of the matrix A. N >= 0.
56: *> \endverbatim
57: *>
58: *> \param[in,out] A
59: *> \verbatim
60: *> A is DOUBLE PRECISION array, dimension (LDA,N)
61: *> On entry, the real M-by-N matrix A. On exit, the elements on and
62: *> below the diagonal contain the N-by-N lower triangular matrix L; the
63: *> elements above the diagonal are the rows of V. See below for
64: *> further details.
65: *> \endverbatim
66: *>
67: *> \param[in] LDA
68: *> \verbatim
69: *> LDA is INTEGER
70: *> The leading dimension of the array A. LDA >= max(1,M).
71: *> \endverbatim
72: *>
73: *> \param[out] T
74: *> \verbatim
75: *> T is DOUBLE PRECISION array, dimension (LDT,N)
76: *> The N-by-N upper triangular factor of the block reflector.
77: *> The elements on and above the diagonal contain the block
78: *> reflector T; the elements below the diagonal are not used.
79: *> See below for further details.
80: *> \endverbatim
81: *>
82: *> \param[in] LDT
83: *> \verbatim
84: *> LDT is INTEGER
85: *> The leading dimension of the array T. LDT >= max(1,N).
86: *> \endverbatim
87: *>
88: *> \param[out] INFO
89: *> \verbatim
90: *> INFO is INTEGER
91: *> = 0: successful exit
92: *> < 0: if INFO = -i, the i-th argument had an illegal value
93: *> \endverbatim
94: *
95: * Authors:
96: * ========
97: *
98: *> \author Univ. of Tennessee
99: *> \author Univ. of California Berkeley
100: *> \author Univ. of Colorado Denver
101: *> \author NAG Ltd.
102: *
103: *> \ingroup doubleGEcomputational
104: *
105: *> \par Further Details:
106: * =====================
107: *>
108: *> \verbatim
109: *>
1.3 bertrand 110: *> The matrix V stores the elementary reflectors H(i) in the i-th row
111: *> above the diagonal. For example, if M=5 and N=3, the matrix V is
1.1 bertrand 112: *>
113: *> V = ( 1 v1 v1 v1 v1 )
114: *> ( 1 v2 v2 v2 )
115: *> ( 1 v3 v3 v3 )
116: *>
117: *>
118: *> where the vi's represent the vectors which define H(i), which are returned
119: *> in the matrix A. The 1's along the diagonal of V are not stored in A. The
120: *> block reflector H is then given by
121: *>
122: *> H = I - V * T * V**T
123: *>
124: *> where V**T is the transpose of V.
125: *>
126: *> For details of the algorithm, see Elmroth and Gustavson (cited above).
127: *> \endverbatim
128: *>
129: * =====================================================================
130: RECURSIVE SUBROUTINE DGELQT3( M, N, A, LDA, T, LDT, INFO )
131: *
1.5 ! bertrand 132: * -- LAPACK computational routine --
1.1 bertrand 133: * -- LAPACK is a software package provided by Univ. of Tennessee, --
134: * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
135: *
136: * .. Scalar Arguments ..
137: INTEGER INFO, LDA, M, N, LDT
138: * ..
139: * .. Array Arguments ..
140: DOUBLE PRECISION A( LDA, * ), T( LDT, * )
141: * ..
142: *
143: * =====================================================================
144: *
145: * .. Parameters ..
146: DOUBLE PRECISION ONE
147: PARAMETER ( ONE = 1.0D+00 )
148: * ..
149: * .. Local Scalars ..
1.3 bertrand 150: INTEGER I, I1, J, J1, M1, M2, IINFO
1.1 bertrand 151: * ..
152: * .. External Subroutines ..
153: EXTERNAL DLARFG, DTRMM, DGEMM, XERBLA
154: * ..
155: * .. Executable Statements ..
156: *
157: INFO = 0
158: IF( M .LT. 0 ) THEN
159: INFO = -1
160: ELSE IF( N .LT. M ) THEN
161: INFO = -2
162: ELSE IF( LDA .LT. MAX( 1, M ) ) THEN
163: INFO = -4
164: ELSE IF( LDT .LT. MAX( 1, M ) ) THEN
165: INFO = -6
166: END IF
167: IF( INFO.NE.0 ) THEN
168: CALL XERBLA( 'DGELQT3', -INFO )
169: RETURN
170: END IF
171: *
172: IF( M.EQ.1 ) THEN
173: *
1.5 ! bertrand 174: * Compute Householder transform when M=1
1.1 bertrand 175: *
176: CALL DLARFG( N, A, A( 1, MIN( 2, N ) ), LDA, T )
177: *
178: ELSE
179: *
180: * Otherwise, split A into blocks...
181: *
182: M1 = M/2
183: M2 = M-M1
184: I1 = MIN( M1+1, M )
185: J1 = MIN( M+1, N )
186: *
187: * Compute A(1:M1,1:N) <- (Y1,R1,T1), where Q1 = I - Y1 T1 Y1^H
188: *
189: CALL DGELQT3( M1, N, A, LDA, T, LDT, IINFO )
190: *
191: * Compute A(J1:M,1:N) = Q1^H A(J1:M,1:N) [workspace: T(1:N1,J1:N)]
192: *
193: DO I=1,M2
194: DO J=1,M1
195: T( I+M1, J ) = A( I+M1, J )
196: END DO
197: END DO
198: CALL DTRMM( 'R', 'U', 'T', 'U', M2, M1, ONE,
199: & A, LDA, T( I1, 1 ), LDT )
200: *
201: CALL DGEMM( 'N', 'T', M2, M1, N-M1, ONE, A( I1, I1 ), LDA,
202: & A( 1, I1 ), LDA, ONE, T( I1, 1 ), LDT)
203: *
204: CALL DTRMM( 'R', 'U', 'N', 'N', M2, M1, ONE,
205: & T, LDT, T( I1, 1 ), LDT )
206: *
207: CALL DGEMM( 'N', 'N', M2, N-M1, M1, -ONE, T( I1, 1 ), LDT,
208: & A( 1, I1 ), LDA, ONE, A( I1, I1 ), LDA )
209: *
210: CALL DTRMM( 'R', 'U', 'N', 'U', M2, M1 , ONE,
211: & A, LDA, T( I1, 1 ), LDT )
212: *
213: DO I=1,M2
214: DO J=1,M1
215: A( I+M1, J ) = A( I+M1, J ) - T( I+M1, J )
216: T( I+M1, J )=0
217: END DO
218: END DO
219: *
220: * Compute A(J1:M,J1:N) <- (Y2,R2,T2) where Q2 = I - Y2 T2 Y2^H
221: *
222: CALL DGELQT3( M2, N-M1, A( I1, I1 ), LDA,
223: & T( I1, I1 ), LDT, IINFO )
224: *
225: * Compute T3 = T(J1:N1,1:N) = -T1 Y1^H Y2 T2
226: *
227: DO I=1,M2
228: DO J=1,M1
229: T( J, I+M1 ) = (A( J, I+M1 ))
230: END DO
231: END DO
232: *
233: CALL DTRMM( 'R', 'U', 'T', 'U', M1, M2, ONE,
234: & A( I1, I1 ), LDA, T( 1, I1 ), LDT )
235: *
236: CALL DGEMM( 'N', 'T', M1, M2, N-M, ONE, A( 1, J1 ), LDA,
237: & A( I1, J1 ), LDA, ONE, T( 1, I1 ), LDT )
238: *
239: CALL DTRMM( 'L', 'U', 'N', 'N', M1, M2, -ONE, T, LDT,
240: & T( 1, I1 ), LDT )
241: *
242: CALL DTRMM( 'R', 'U', 'N', 'N', M1, M2, ONE,
243: & T( I1, I1 ), LDT, T( 1, I1 ), LDT )
244: *
245: *
246: *
247: * Y = (Y1,Y2); L = [ L1 0 ]; T = [T1 T3]
248: * [ A(1:N1,J1:N) L2 ] [ 0 T2]
249: *
250: END IF
251: *
252: RETURN
253: *
254: * End of DGELQT3
255: *
256: END
CVSweb interface <joel.bertrand@systella.fr>