LAPACK  3.4.1
LAPACK: Linear Algebra PACKage
cgerq2.f
Go to the documentation of this file.
00001 *> \brief \b CGERQ2
00002 *
00003 *  =========== DOCUMENTATION ===========
00004 *
00005 * Online html documentation available at 
00006 *            http://www.netlib.org/lapack/explore-html/ 
00007 *
00008 *> \htmlonly
00009 *> Download CGERQ2 + dependencies 
00010 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/cgerq2.f"> 
00011 *> [TGZ]</a> 
00012 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/cgerq2.f"> 
00013 *> [ZIP]</a> 
00014 *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/cgerq2.f"> 
00015 *> [TXT]</a>
00016 *> \endhtmlonly 
00017 *
00018 *  Definition:
00019 *  ===========
00020 *
00021 *       SUBROUTINE CGERQ2( M, N, A, LDA, TAU, WORK, INFO )
00022 * 
00023 *       .. Scalar Arguments ..
00024 *       INTEGER            INFO, LDA, M, N
00025 *       ..
00026 *       .. Array Arguments ..
00027 *       COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
00028 *       ..
00029 *  
00030 *
00031 *> \par Purpose:
00032 *  =============
00033 *>
00034 *> \verbatim
00035 *>
00036 *> CGERQ2 computes an RQ factorization of a complex m by n matrix A:
00037 *> A = R * Q.
00038 *> \endverbatim
00039 *
00040 *  Arguments:
00041 *  ==========
00042 *
00043 *> \param[in] M
00044 *> \verbatim
00045 *>          M is INTEGER
00046 *>          The number of rows of the matrix A.  M >= 0.
00047 *> \endverbatim
00048 *>
00049 *> \param[in] N
00050 *> \verbatim
00051 *>          N is INTEGER
00052 *>          The number of columns of the matrix A.  N >= 0.
00053 *> \endverbatim
00054 *>
00055 *> \param[in,out] A
00056 *> \verbatim
00057 *>          A is COMPLEX array, dimension (LDA,N)
00058 *>          On entry, the m by n matrix A.
00059 *>          On exit, if m <= n, the upper triangle of the subarray
00060 *>          A(1:m,n-m+1:n) contains the m by m upper triangular matrix R;
00061 *>          if m >= n, the elements on and above the (m-n)-th subdiagonal
00062 *>          contain the m by n upper trapezoidal matrix R; the remaining
00063 *>          elements, with the array TAU, represent the unitary matrix
00064 *>          Q as a product of elementary reflectors (see Further
00065 *>          Details).
00066 *> \endverbatim
00067 *>
00068 *> \param[in] LDA
00069 *> \verbatim
00070 *>          LDA is INTEGER
00071 *>          The leading dimension of the array A.  LDA >= max(1,M).
00072 *> \endverbatim
00073 *>
00074 *> \param[out] TAU
00075 *> \verbatim
00076 *>          TAU is COMPLEX array, dimension (min(M,N))
00077 *>          The scalar factors of the elementary reflectors (see Further
00078 *>          Details).
00079 *> \endverbatim
00080 *>
00081 *> \param[out] WORK
00082 *> \verbatim
00083 *>          WORK is COMPLEX array, dimension (M)
00084 *> \endverbatim
00085 *>
00086 *> \param[out] INFO
00087 *> \verbatim
00088 *>          INFO is INTEGER
00089 *>          = 0: successful exit
00090 *>          < 0: if INFO = -i, the i-th argument had an illegal value
00091 *> \endverbatim
00092 *
00093 *  Authors:
00094 *  ========
00095 *
00096 *> \author Univ. of Tennessee 
00097 *> \author Univ. of California Berkeley 
00098 *> \author Univ. of Colorado Denver 
00099 *> \author NAG Ltd. 
00100 *
00101 *> \date November 2011
00102 *
00103 *> \ingroup complexGEcomputational
00104 *
00105 *> \par Further Details:
00106 *  =====================
00107 *>
00108 *> \verbatim
00109 *>
00110 *>  The matrix Q is represented as a product of elementary reflectors
00111 *>
00112 *>     Q = H(1)**H H(2)**H . . . H(k)**H, where k = min(m,n).
00113 *>
00114 *>  Each H(i) has the form
00115 *>
00116 *>     H(i) = I - tau * v * v**H
00117 *>
00118 *>  where tau is a complex scalar, and v is a complex vector with
00119 *>  v(n-k+i+1:n) = 0 and v(n-k+i) = 1; conjg(v(1:n-k+i-1)) is stored on
00120 *>  exit in A(m-k+i,1:n-k+i-1), and tau in TAU(i).
00121 *> \endverbatim
00122 *>
00123 *  =====================================================================
00124       SUBROUTINE CGERQ2( M, N, A, LDA, TAU, WORK, INFO )
00125 *
00126 *  -- LAPACK computational routine (version 3.4.0) --
00127 *  -- LAPACK is a software package provided by Univ. of Tennessee,    --
00128 *  -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
00129 *     November 2011
00130 *
00131 *     .. Scalar Arguments ..
00132       INTEGER            INFO, LDA, M, N
00133 *     ..
00134 *     .. Array Arguments ..
00135       COMPLEX            A( LDA, * ), TAU( * ), WORK( * )
00136 *     ..
00137 *
00138 *  =====================================================================
00139 *
00140 *     .. Parameters ..
00141       COMPLEX            ONE
00142       PARAMETER          ( ONE = ( 1.0E+0, 0.0E+0 ) )
00143 *     ..
00144 *     .. Local Scalars ..
00145       INTEGER            I, K
00146       COMPLEX            ALPHA
00147 *     ..
00148 *     .. External Subroutines ..
00149       EXTERNAL           CLACGV, CLARF, CLARFG, XERBLA
00150 *     ..
00151 *     .. Intrinsic Functions ..
00152       INTRINSIC          MAX, MIN
00153 *     ..
00154 *     .. Executable Statements ..
00155 *
00156 *     Test the input arguments
00157 *
00158       INFO = 0
00159       IF( M.LT.0 ) THEN
00160          INFO = -1
00161       ELSE IF( N.LT.0 ) THEN
00162          INFO = -2
00163       ELSE IF( LDA.LT.MAX( 1, M ) ) THEN
00164          INFO = -4
00165       END IF
00166       IF( INFO.NE.0 ) THEN
00167          CALL XERBLA( 'CGERQ2', -INFO )
00168          RETURN
00169       END IF
00170 *
00171       K = MIN( M, N )
00172 *
00173       DO 10 I = K, 1, -1
00174 *
00175 *        Generate elementary reflector H(i) to annihilate
00176 *        A(m-k+i,1:n-k+i-1)
00177 *
00178          CALL CLACGV( N-K+I, A( M-K+I, 1 ), LDA )
00179          ALPHA = A( M-K+I, N-K+I )
00180          CALL CLARFG( N-K+I, ALPHA, A( M-K+I, 1 ), LDA,
00181      $                TAU( I ) )
00182 *
00183 *        Apply H(i) to A(1:m-k+i-1,1:n-k+i) from the right
00184 *
00185          A( M-K+I, N-K+I ) = ONE
00186          CALL CLARF( 'Right', M-K+I-1, N-K+I, A( M-K+I, 1 ), LDA,
00187      $               TAU( I ), A, LDA, WORK )
00188          A( M-K+I, N-K+I ) = ALPHA
00189          CALL CLACGV( N-K+I-1, A( M-K+I, 1 ), LDA )
00190    10 CONTINUE
00191       RETURN
00192 *
00193 *     End of CGERQ2
00194 *
00195       END
 All Files Functions