1*> \brief \b ZGEQRS 2* 3* =========== DOCUMENTATION =========== 4* 5* Online html documentation available at 6* http://www.netlib.org/lapack/explore-html/ 7* 8* Definition: 9* =========== 10* 11* SUBROUTINE ZGEQRS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK, 12* INFO ) 13* 14* .. Scalar Arguments .. 15* INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS 16* .. 17* .. Array Arguments .. 18* COMPLEX*16 A( LDA, * ), B( LDB, * ), TAU( * ), 19* $ WORK( LWORK ) 20* .. 21* 22* 23*> \par Purpose: 24* ============= 25*> 26*> \verbatim 27*> 28*> Solve the least squares problem 29*> min || A*X - B || 30*> using the QR factorization 31*> A = Q*R 32*> computed by ZGEQRF. 33*> \endverbatim 34* 35* Arguments: 36* ========== 37* 38*> \param[in] M 39*> \verbatim 40*> M is INTEGER 41*> The number of rows of the matrix A. M >= 0. 42*> \endverbatim 43*> 44*> \param[in] N 45*> \verbatim 46*> N is INTEGER 47*> The number of columns of the matrix A. M >= N >= 0. 48*> \endverbatim 49*> 50*> \param[in] NRHS 51*> \verbatim 52*> NRHS is INTEGER 53*> The number of columns of B. NRHS >= 0. 54*> \endverbatim 55*> 56*> \param[in] A 57*> \verbatim 58*> A is COMPLEX*16 array, dimension (LDA,N) 59*> Details of the QR factorization of the original matrix A as 60*> returned by ZGEQRF. 61*> \endverbatim 62*> 63*> \param[in] LDA 64*> \verbatim 65*> LDA is INTEGER 66*> The leading dimension of the array A. LDA >= M. 67*> \endverbatim 68*> 69*> \param[in] TAU 70*> \verbatim 71*> TAU is COMPLEX*16 array, dimension (N) 72*> Details of the orthogonal matrix Q. 73*> \endverbatim 74*> 75*> \param[in,out] B 76*> \verbatim 77*> B is COMPLEX*16 array, dimension (LDB,NRHS) 78*> On entry, the m-by-nrhs right hand side matrix B. 79*> On exit, the n-by-nrhs solution matrix X. 80*> \endverbatim 81*> 82*> \param[in] LDB 83*> \verbatim 84*> LDB is INTEGER 85*> The leading dimension of the array B. LDB >= M. 86*> \endverbatim 87*> 88*> \param[out] WORK 89*> \verbatim 90*> WORK is COMPLEX*16 array, dimension (LWORK) 91*> \endverbatim 92*> 93*> \param[in] LWORK 94*> \verbatim 95*> LWORK is INTEGER 96*> The length of the array WORK. LWORK must be at least NRHS, 97*> and should be at least NRHS*NB, where NB is the block size 98*> for this environment. 99*> \endverbatim 100*> 101*> \param[out] INFO 102*> \verbatim 103*> INFO is INTEGER 104*> = 0: successful exit 105*> < 0: if INFO = -i, the i-th argument had an illegal value 106*> \endverbatim 107* 108* Authors: 109* ======== 110* 111*> \author Univ. of Tennessee 112*> \author Univ. of California Berkeley 113*> \author Univ. of Colorado Denver 114*> \author NAG Ltd. 115* 116*> \date November 2011 117* 118*> \ingroup complex16_lin 119* 120* ===================================================================== 121 SUBROUTINE ZGEQRS( M, N, NRHS, A, LDA, TAU, B, LDB, WORK, LWORK, 122 $ INFO ) 123* 124* -- LAPACK test routine (version 3.4.0) -- 125* -- LAPACK is a software package provided by Univ. of Tennessee, -- 126* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- 127* November 2011 128* 129* .. Scalar Arguments .. 130 INTEGER INFO, LDA, LDB, LWORK, M, N, NRHS 131* .. 132* .. Array Arguments .. 133 COMPLEX*16 A( LDA, * ), B( LDB, * ), TAU( * ), 134 $ WORK( LWORK ) 135* .. 136* 137* ===================================================================== 138* 139* .. Parameters .. 140 COMPLEX*16 ONE 141 PARAMETER ( ONE = ( 1.0D+0, 0.0D+0 ) ) 142* .. 143* .. External Subroutines .. 144 EXTERNAL XERBLA, ZTRSM, ZUNMQR 145* .. 146* .. Intrinsic Functions .. 147 INTRINSIC MAX 148* .. 149* .. Executable Statements .. 150* 151* Test the input arguments. 152* 153 INFO = 0 154 IF( M.LT.0 ) THEN 155 INFO = -1 156 ELSE IF( N.LT.0 .OR. N.GT.M ) THEN 157 INFO = -2 158 ELSE IF( NRHS.LT.0 ) THEN 159 INFO = -3 160 ELSE IF( LDA.LT.MAX( 1, M ) ) THEN 161 INFO = -5 162 ELSE IF( LDB.LT.MAX( 1, M ) ) THEN 163 INFO = -8 164 ELSE IF( LWORK.LT.1 .OR. LWORK.LT.NRHS .AND. M.GT.0 .AND. N.GT.0 ) 165 $ THEN 166 INFO = -10 167 END IF 168 IF( INFO.NE.0 ) THEN 169 CALL XERBLA( 'ZGEQRS', -INFO ) 170 RETURN 171 END IF 172* 173* Quick return if possible 174* 175 IF( N.EQ.0 .OR. NRHS.EQ.0 .OR. M.EQ.0 ) 176 $ RETURN 177* 178* B := Q' * B 179* 180 CALL ZUNMQR( 'Left', 'Conjugate transpose', M, NRHS, N, A, LDA, 181 $ TAU, B, LDB, WORK, LWORK, INFO ) 182* 183* Solve R*X = B(1:n,:) 184* 185 CALL ZTRSM( 'Left', 'Upper', 'No transpose', 'Non-unit', N, NRHS, 186 $ ONE, A, LDA, B, LDB ) 187* 188 RETURN 189* 190* End of ZGEQRS 191* 192 END 193