LAPACK  3.10.0
LAPACK: Linear Algebra PACKage
zgeqr2.f
Go to the documentation of this file.
1 *> \brief \b ZGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm.
2 *
3 * =========== DOCUMENTATION ===========
4 *
5 * Online html documentation available at
6 * http://www.netlib.org/lapack/explore-html/
7 *
8 *> \htmlonly
9 *> Download ZGEQR2 + dependencies
10 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/zgeqr2.f">
11 *> [TGZ]</a>
12 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/zgeqr2.f">
13 *> [ZIP]</a>
14 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/zgeqr2.f">
15 *> [TXT]</a>
16 *> \endhtmlonly
17 *
18 * Definition:
19 * ===========
20 *
21 * SUBROUTINE ZGEQR2( M, N, A, LDA, TAU, WORK, INFO )
22 *
23 * .. Scalar Arguments ..
24 * INTEGER INFO, LDA, M, N
25 * ..
26 * .. Array Arguments ..
27 * COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
28 * ..
29 *
30 *
31 *> \par Purpose:
32 * =============
33 *>
34 *> \verbatim
35 *>
36 *> ZGEQR2 computes a QR factorization of a complex m-by-n matrix A:
37 *>
38 *> A = Q * ( R ),
39 *> ( 0 )
40 *>
41 *> where:
42 *>
43 *> Q is a m-by-m orthogonal matrix;
44 *> R is an upper-triangular n-by-n matrix;
45 *> 0 is a (m-n)-by-n zero matrix, if m > n.
46 *>
47 *> \endverbatim
48 *
49 * Arguments:
50 * ==========
51 *
52 *> \param[in] M
53 *> \verbatim
54 *> M is INTEGER
55 *> The number of rows of the matrix A. M >= 0.
56 *> \endverbatim
57 *>
58 *> \param[in] N
59 *> \verbatim
60 *> N is INTEGER
61 *> The number of columns of the matrix A. N >= 0.
62 *> \endverbatim
63 *>
64 *> \param[in,out] A
65 *> \verbatim
66 *> A is COMPLEX*16 array, dimension (LDA,N)
67 *> On entry, the m by n matrix A.
68 *> On exit, the elements on and above the diagonal of the array
69 *> contain the min(m,n) by n upper trapezoidal matrix R (R is
70 *> upper triangular if m >= n); the elements below the diagonal,
71 *> with the array TAU, represent the unitary matrix Q as a
72 *> product of elementary reflectors (see Further Details).
73 *> \endverbatim
74 *>
75 *> \param[in] LDA
76 *> \verbatim
77 *> LDA is INTEGER
78 *> The leading dimension of the array A. LDA >= max(1,M).
79 *> \endverbatim
80 *>
81 *> \param[out] TAU
82 *> \verbatim
83 *> TAU is COMPLEX*16 array, dimension (min(M,N))
84 *> The scalar factors of the elementary reflectors (see Further
85 *> Details).
86 *> \endverbatim
87 *>
88 *> \param[out] WORK
89 *> \verbatim
90 *> WORK is COMPLEX*16 array, dimension (N)
91 *> \endverbatim
92 *>
93 *> \param[out] INFO
94 *> \verbatim
95 *> INFO is INTEGER
96 *> = 0: successful exit
97 *> < 0: if INFO = -i, the i-th argument had an illegal value
98 *> \endverbatim
99 *
100 * Authors:
101 * ========
102 *
103 *> \author Univ. of Tennessee
104 *> \author Univ. of California Berkeley
105 *> \author Univ. of Colorado Denver
106 *> \author NAG Ltd.
107 *
108 *> \ingroup complex16GEcomputational
109 *
110 *> \par Further Details:
111 * =====================
112 *>
113 *> \verbatim
114 *>
115 *> The matrix Q is represented as a product of elementary reflectors
116 *>
117 *> Q = H(1) H(2) . . . H(k), where k = min(m,n).
118 *>
119 *> Each H(i) has the form
120 *>
121 *> H(i) = I - tau * v * v**H
122 *>
123 *> where tau is a complex scalar, and v is a complex vector with
124 *> v(1:i-1) = 0 and v(i) = 1; v(i+1:m) is stored on exit in A(i+1:m,i),
125 *> and tau in TAU(i).
126 *> \endverbatim
127 *>
128 * =====================================================================
129  SUBROUTINE zgeqr2( M, N, A, LDA, TAU, WORK, INFO )
130 *
131 * -- LAPACK computational routine --
132 * -- LAPACK is a software package provided by Univ. of Tennessee, --
133 * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
134 *
135 * .. Scalar Arguments ..
136  INTEGER INFO, LDA, M, N
137 * ..
138 * .. Array Arguments ..
139  COMPLEX*16 A( LDA, * ), TAU( * ), WORK( * )
140 * ..
141 *
142 * =====================================================================
143 *
144 * .. Parameters ..
145  COMPLEX*16 ONE
146  parameter( one = ( 1.0d+0, 0.0d+0 ) )
147 * ..
148 * .. Local Scalars ..
149  INTEGER I, K
150  COMPLEX*16 ALPHA
151 * ..
152 * .. External Subroutines ..
153  EXTERNAL xerbla, zlarf, zlarfg
154 * ..
155 * .. Intrinsic Functions ..
156  INTRINSIC dconjg, max, min
157 * ..
158 * .. Executable Statements ..
159 *
160 * Test the input arguments
161 *
162  info = 0
163  IF( m.LT.0 ) THEN
164  info = -1
165  ELSE IF( n.LT.0 ) THEN
166  info = -2
167  ELSE IF( lda.LT.max( 1, m ) ) THEN
168  info = -4
169  END IF
170  IF( info.NE.0 ) THEN
171  CALL xerbla( 'ZGEQR2', -info )
172  RETURN
173  END IF
174 *
175  k = min( m, n )
176 *
177  DO 10 i = 1, k
178 *
179 * Generate elementary reflector H(i) to annihilate A(i+1:m,i)
180 *
181  CALL zlarfg( m-i+1, a( i, i ), a( min( i+1, m ), i ), 1,
182  $ tau( i ) )
183  IF( i.LT.n ) THEN
184 *
185 * Apply H(i)**H to A(i:m,i+1:n) from the left
186 *
187  alpha = a( i, i )
188  a( i, i ) = one
189  CALL zlarf( 'Left', m-i+1, n-i, a( i, i ), 1,
190  $ dconjg( tau( i ) ), a( i, i+1 ), lda, work )
191  a( i, i ) = alpha
192  END IF
193  10 CONTINUE
194  RETURN
195 *
196 * End of ZGEQR2
197 *
198  END
subroutine xerbla(SRNAME, INFO)
XERBLA
Definition: xerbla.f:60
subroutine zgeqr2(M, N, A, LDA, TAU, WORK, INFO)
ZGEQR2 computes the QR factorization of a general rectangular matrix using an unblocked algorithm.
Definition: zgeqr2.f:130
subroutine zlarf(SIDE, M, N, V, INCV, TAU, C, LDC, WORK)
ZLARF applies an elementary reflector to a general rectangular matrix.
Definition: zlarf.f:128
subroutine zlarfg(N, ALPHA, X, INCX, TAU)
ZLARFG generates an elementary reflector (Householder matrix).
Definition: zlarfg.f:106