LAPACK 3.12.1
LAPACK: Linear Algebra PACKage
Loading...
Searching...
No Matches
dgeqrf.f
Go to the documentation of this file.
1*> \brief \b DGEQRF
2*
3* =========== DOCUMENTATION ===========
4*
5* Online html documentation available at
6* http://www.netlib.org/lapack/explore-html/
7*
8*> Download DGEQRF + dependencies
9*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dgeqrf.f">
10*> [TGZ]</a>
11*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dgeqrf.f">
12*> [ZIP]</a>
13*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dgeqrf.f">
14*> [TXT]</a>
15*
16* Definition:
17* ===========
18*
19* SUBROUTINE DGEQRF( M, N, A, LDA, TAU, WORK, LWORK, INFO )
20*
21* .. Scalar Arguments ..
22* INTEGER INFO, LDA, LWORK, M, N
23* ..
24* .. Array Arguments ..
25* DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
26* ..
27*
28*
29*> \par Purpose:
30* =============
31*>
32*> \verbatim
33*>
34*> DGEQRF computes a QR factorization of a real M-by-N matrix A:
35*>
36*> A = Q * ( R ),
37*> ( 0 )
38*>
39*> where:
40*>
41*> Q is a M-by-M orthogonal matrix;
42*> R is an upper-triangular N-by-N matrix;
43*> 0 is a (M-N)-by-N zero matrix, if M > N.
44*>
45*> \endverbatim
46*
47* Arguments:
48* ==========
49*
50*> \param[in] M
51*> \verbatim
52*> M is INTEGER
53*> The number of rows of the matrix A. M >= 0.
54*> \endverbatim
55*>
56*> \param[in] N
57*> \verbatim
58*> N is INTEGER
59*> The number of columns of the matrix A. N >= 0.
60*> \endverbatim
61*>
62*> \param[in,out] A
63*> \verbatim
64*> A is DOUBLE PRECISION array, dimension (LDA,N)
65*> On entry, the M-by-N matrix A.
66*> On exit, the elements on and above the diagonal of the array
67*> contain the min(M,N)-by-N upper trapezoidal matrix R (R is
68*> upper triangular if m >= n); the elements below the diagonal,
69*> with the array TAU, represent the orthogonal matrix Q as a
70*> product of min(m,n) elementary reflectors (see Further
71*> Details).
72*> \endverbatim
73*>
74*> \param[in] LDA
75*> \verbatim
76*> LDA is INTEGER
77*> The leading dimension of the array A. LDA >= max(1,M).
78*> \endverbatim
79*>
80*> \param[out] TAU
81*> \verbatim
82*> TAU is DOUBLE PRECISION array, dimension (min(M,N))
83*> The scalar factors of the elementary reflectors (see Further
84*> Details).
85*> \endverbatim
86*>
87*> \param[out] WORK
88*> \verbatim
89*> WORK is DOUBLE PRECISION array, dimension (MAX(1,LWORK))
90*> On exit, if INFO = 0, WORK(1) returns the optimal LWORK.
91*> \endverbatim
92*>
93*> \param[in] LWORK
94*> \verbatim
95*> LWORK is INTEGER
96*> The dimension of the array WORK.
97*> LWORK >= 1, if MIN(M,N) = 0, and LWORK >= N, otherwise.
98*> For optimum performance LWORK >= N*NB, where NB is
99*> the optimal blocksize.
100*>
101*> If LWORK = -1, then a workspace query is assumed; the routine
102*> only calculates the optimal size of the WORK array, returns
103*> this value as the first entry of the WORK array, and no error
104*> message related to LWORK is issued by XERBLA.
105*> \endverbatim
106*>
107*> \param[out] INFO
108*> \verbatim
109*> INFO is INTEGER
110*> = 0: successful exit
111*> < 0: if INFO = -i, the i-th argument had an illegal value
112*> \endverbatim
113*
114* Authors:
115* ========
116*
117*> \author Univ. of Tennessee
118*> \author Univ. of California Berkeley
119*> \author Univ. of Colorado Denver
120*> \author NAG Ltd.
121*
122*> \ingroup geqrf
123*
124*> \par Further Details:
125* =====================
126*>
127*> \verbatim
128*>
129*> The matrix Q is represented as a product of elementary reflectors
130*>
131*> Q = H(1) H(2) . . . H(k), where k = min(m,n).
132*>
133*> Each H(i) has the form
134*>
135*> H(i) = I - tau * v * v**T
136*>
137*> where tau is a real scalar, and v is a real vector with
138*> v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
139*> and tau in TAU(i).
140*> \endverbatim
141*>
142* =====================================================================
143 SUBROUTINE dgeqrf( M, N, A, LDA, TAU, WORK, LWORK, INFO )
144*
145* -- LAPACK computational routine --
146* -- LAPACK is a software package provided by Univ. of Tennessee, --
147* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
148*
149* .. Scalar Arguments ..
150 INTEGER INFO, LDA, LWORK, M, N
151* ..
152* .. Array Arguments ..
153 DOUBLE PRECISION A( LDA, * ), TAU( * ), WORK( * )
154* ..
155*
156* =====================================================================
157*
158* .. Local Scalars ..
159 LOGICAL LQUERY
160 INTEGER I, IB, IINFO, IWS, K, LDWORK, LWKOPT, NB,
161 $ NBMIN, NX
162* ..
163* .. External Subroutines ..
164 EXTERNAL dgeqr2, dlarfb, dlarft, xerbla
165* ..
166* .. Intrinsic Functions ..
167 INTRINSIC max, min
168* ..
169* .. External Functions ..
170 INTEGER ILAENV
171 EXTERNAL ilaenv
172* ..
173* .. Executable Statements ..
174*
175* Test the input arguments
176*
177 k = min( m, n )
178 info = 0
179 nb = ilaenv( 1, 'DGEQRF', ' ', m, n, -1, -1 )
180 lquery = ( lwork.EQ.-1 )
181 IF( m.LT.0 ) THEN
182 info = -1
183 ELSE IF( n.LT.0 ) THEN
184 info = -2
185 ELSE IF( lda.LT.max( 1, m ) ) THEN
186 info = -4
187 ELSE IF( .NOT.lquery ) THEN
188 IF( lwork.LE.0 .OR. ( m.GT.0 .AND. lwork.LT.max( 1, n ) ) )
189 $ info = -7
190 END IF
191 IF( info.NE.0 ) THEN
192 CALL xerbla( 'DGEQRF', -info )
193 RETURN
194 ELSE IF( lquery ) THEN
195 IF( k.EQ.0 ) THEN
196 lwkopt = 1
197 ELSE
198 lwkopt = n*nb
199 END IF
200 work( 1 ) = lwkopt
201 RETURN
202 END IF
203*
204* Quick return if possible
205*
206 IF( k.EQ.0 ) THEN
207 work( 1 ) = 1
208 RETURN
209 END IF
210*
211 nbmin = 2
212 nx = 0
213 iws = n
214 IF( nb.GT.1 .AND. nb.LT.k ) THEN
215*
216* Determine when to cross over from blocked to unblocked code.
217*
218 nx = max( 0, ilaenv( 3, 'DGEQRF', ' ', m, n, -1, -1 ) )
219 IF( nx.LT.k ) THEN
220*
221* Determine if workspace is large enough for blocked code.
222*
223 ldwork = n
224 iws = ldwork*nb
225 IF( lwork.LT.iws ) THEN
226*
227* Not enough workspace to use optimal NB: reduce NB and
228* determine the minimum value of NB.
229*
230 nb = lwork / ldwork
231 nbmin = max( 2, ilaenv( 2, 'DGEQRF', ' ', m, n, -1,
232 $ -1 ) )
233 END IF
234 END IF
235 END IF
236*
237 IF( nb.GE.nbmin .AND. nb.LT.k .AND. nx.LT.k ) THEN
238*
239* Use blocked code initially
240*
241 DO 10 i = 1, k - nx, nb
242 ib = min( k-i+1, nb )
243*
244* Compute the QR factorization of the current block
245* A(i:m,i:i+ib-1)
246*
247 CALL dgeqr2( m-i+1, ib, a( i, i ), lda, tau( i ), work,
248 $ iinfo )
249 IF( i+ib.LE.n ) THEN
250*
251* Form the triangular factor of the block reflector
252* H = H(i) H(i+1) . . . H(i+ib-1)
253*
254 CALL dlarft( 'Forward', 'Columnwise', m-i+1, ib,
255 $ a( i, i ), lda, tau( i ), work, ldwork )
256*
257* Apply H**T to A(i:m,i+ib:n) from the left
258*
259 CALL dlarfb( 'Left', 'Transpose', 'Forward',
260 $ 'Columnwise', m-i+1, n-i-ib+1, ib,
261 $ a( i, i ), lda, work, ldwork, a( i, i+ib ),
262 $ lda, work( ib+1 ), ldwork )
263 END IF
264 10 CONTINUE
265 ELSE
266 i = 1
267 END IF
268*
269* Use unblocked code to factor the last or only block.
270*
271 IF( i.LE.k )
272 $ CALL dgeqr2( m-i+1, n-i+1, a( i, i ), lda, tau( i ), work,
273 $ iinfo )
274*
275 work( 1 ) = iws
276 RETURN
277*
278* End of DGEQRF
279*
280 END
subroutine xerbla(srname, info)
Definition cblat2.f:3285
subroutine dgeqr2(m, n, a, lda, tau, work, info)
DGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm.
Definition dgeqr2.f:128
subroutine dgeqrf(m, n, a, lda, tau, work, lwork, info)
DGEQRF
Definition dgeqrf.f:144
subroutine dlarfb(side, trans, direct, storev, m, n, k, v, ldv, t, ldt, c, ldc, work, ldwork)
DLARFB applies a block reflector or its transpose to a general rectangular matrix.
Definition dlarfb.f:195
recursive subroutine dlarft(direct, storev, n, k, v, ldv, tau, t, ldt)
DLARFT forms the triangular factor T of a block reflector H = I - vtvH
Definition dlarft.f:162