version 1.6, 2010/08/13 21:03:53
|
version 1.14, 2014/01/27 09:28:23
|
Line 1
|
Line 1
|
|
*> \brief \b DLASR applies a sequence of plane rotations to a general rectangular matrix. |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download DLASR + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasr.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasr.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasr.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) |
|
* |
|
* .. Scalar Arguments .. |
|
* CHARACTER DIRECT, PIVOT, SIDE |
|
* INTEGER LDA, M, N |
|
* .. |
|
* .. Array Arguments .. |
|
* DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DLASR applies a sequence of plane rotations to a real matrix A, |
|
*> from either the left or the right. |
|
*> |
|
*> When SIDE = 'L', the transformation takes the form |
|
*> |
|
*> A := P*A |
|
*> |
|
*> and when SIDE = 'R', the transformation takes the form |
|
*> |
|
*> A := A*P**T |
|
*> |
|
*> where P is an orthogonal matrix consisting of a sequence of z plane |
|
*> rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', |
|
*> and P**T is the transpose of P. |
|
*> |
|
*> When DIRECT = 'F' (Forward sequence), then |
|
*> |
|
*> P = P(z-1) * ... * P(2) * P(1) |
|
*> |
|
*> and when DIRECT = 'B' (Backward sequence), then |
|
*> |
|
*> P = P(1) * P(2) * ... * P(z-1) |
|
*> |
|
*> where P(k) is a plane rotation matrix defined by the 2-by-2 rotation |
|
*> |
|
*> R(k) = ( c(k) s(k) ) |
|
*> = ( -s(k) c(k) ). |
|
*> |
|
*> When PIVOT = 'V' (Variable pivot), the rotation is performed |
|
*> for the plane (k,k+1), i.e., P(k) has the form |
|
*> |
|
*> P(k) = ( 1 ) |
|
*> ( ... ) |
|
*> ( 1 ) |
|
*> ( c(k) s(k) ) |
|
*> ( -s(k) c(k) ) |
|
*> ( 1 ) |
|
*> ( ... ) |
|
*> ( 1 ) |
|
*> |
|
*> where R(k) appears as a rank-2 modification to the identity matrix in |
|
*> rows and columns k and k+1. |
|
*> |
|
*> When PIVOT = 'T' (Top pivot), the rotation is performed for the |
|
*> plane (1,k+1), so P(k) has the form |
|
*> |
|
*> P(k) = ( c(k) s(k) ) |
|
*> ( 1 ) |
|
*> ( ... ) |
|
*> ( 1 ) |
|
*> ( -s(k) c(k) ) |
|
*> ( 1 ) |
|
*> ( ... ) |
|
*> ( 1 ) |
|
*> |
|
*> where R(k) appears in rows and columns 1 and k+1. |
|
*> |
|
*> Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is |
|
*> performed for the plane (k,z), giving P(k) the form |
|
*> |
|
*> P(k) = ( 1 ) |
|
*> ( ... ) |
|
*> ( 1 ) |
|
*> ( c(k) s(k) ) |
|
*> ( 1 ) |
|
*> ( ... ) |
|
*> ( 1 ) |
|
*> ( -s(k) c(k) ) |
|
*> |
|
*> where R(k) appears in rows and columns k and z. The rotations are |
|
*> performed without ever forming P(k) explicitly. |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] SIDE |
|
*> \verbatim |
|
*> SIDE is CHARACTER*1 |
|
*> Specifies whether the plane rotation matrix P is applied to |
|
*> A on the left or the right. |
|
*> = 'L': Left, compute A := P*A |
|
*> = 'R': Right, compute A:= A*P**T |
|
*> \endverbatim |
|
*> |
|
*> \param[in] PIVOT |
|
*> \verbatim |
|
*> PIVOT is CHARACTER*1 |
|
*> Specifies the plane for which P(k) is a plane rotation |
|
*> matrix. |
|
*> = 'V': Variable pivot, the plane (k,k+1) |
|
*> = 'T': Top pivot, the plane (1,k+1) |
|
*> = 'B': Bottom pivot, the plane (k,z) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] DIRECT |
|
*> \verbatim |
|
*> DIRECT is CHARACTER*1 |
|
*> Specifies whether P is a forward or backward sequence of |
|
*> plane rotations. |
|
*> = 'F': Forward, P = P(z-1)*...*P(2)*P(1) |
|
*> = 'B': Backward, P = P(1)*P(2)*...*P(z-1) |
|
*> \endverbatim |
|
*> |
|
*> \param[in] M |
|
*> \verbatim |
|
*> M is INTEGER |
|
*> The number of rows of the matrix A. If m <= 1, an immediate |
|
*> return is effected. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> The number of columns of the matrix A. If n <= 1, an |
|
*> immediate return is effected. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] C |
|
*> \verbatim |
|
*> C is DOUBLE PRECISION array, dimension |
|
*> (M-1) if SIDE = 'L' |
|
*> (N-1) if SIDE = 'R' |
|
*> The cosines c(k) of the plane rotations. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] S |
|
*> \verbatim |
|
*> S is DOUBLE PRECISION array, dimension |
|
*> (M-1) if SIDE = 'L' |
|
*> (N-1) if SIDE = 'R' |
|
*> The sines s(k) of the plane rotations. The 2-by-2 plane |
|
*> rotation part of the matrix P(k), R(k), has the form |
|
*> R(k) = ( c(k) s(k) ) |
|
*> ( -s(k) c(k) ). |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] A |
|
*> \verbatim |
|
*> A is DOUBLE PRECISION array, dimension (LDA,N) |
|
*> The M-by-N matrix A. On exit, A is overwritten by P*A if |
|
*> SIDE = 'R' or by A*P**T if SIDE = 'L'. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDA |
|
*> \verbatim |
|
*> LDA is INTEGER |
|
*> The leading dimension of the array A. LDA >= max(1,M). |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \date September 2012 |
|
* |
|
*> \ingroup auxOTHERauxiliary |
|
* |
|
* ===================================================================== |
SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) |
SUBROUTINE DLASR( SIDE, PIVOT, DIRECT, M, N, C, S, A, LDA ) |
* |
* |
* -- LAPACK auxiliary routine (version 3.2) -- |
* -- LAPACK auxiliary routine (version 3.4.2) -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- LAPACK is a software package provided by Univ. of Tennessee, -- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..-- |
* November 2006 |
* September 2012 |
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER DIRECT, PIVOT, SIDE |
CHARACTER DIRECT, PIVOT, SIDE |
Line 13
|
Line 212
|
DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) |
DOUBLE PRECISION A( LDA, * ), C( * ), S( * ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DLASR applies a sequence of plane rotations to a real matrix A, |
|
* from either the left or the right. |
|
* |
|
* When SIDE = 'L', the transformation takes the form |
|
* |
|
* A := P*A |
|
* |
|
* and when SIDE = 'R', the transformation takes the form |
|
* |
|
* A := A*P**T |
|
* |
|
* where P is an orthogonal matrix consisting of a sequence of z plane |
|
* rotations, with z = M when SIDE = 'L' and z = N when SIDE = 'R', |
|
* and P**T is the transpose of P. |
|
* |
|
* When DIRECT = 'F' (Forward sequence), then |
|
* |
|
* P = P(z-1) * ... * P(2) * P(1) |
|
* |
|
* and when DIRECT = 'B' (Backward sequence), then |
|
* |
|
* P = P(1) * P(2) * ... * P(z-1) |
|
* |
|
* where P(k) is a plane rotation matrix defined by the 2-by-2 rotation |
|
* |
|
* R(k) = ( c(k) s(k) ) |
|
* = ( -s(k) c(k) ). |
|
* |
|
* When PIVOT = 'V' (Variable pivot), the rotation is performed |
|
* for the plane (k,k+1), i.e., P(k) has the form |
|
* |
|
* P(k) = ( 1 ) |
|
* ( ... ) |
|
* ( 1 ) |
|
* ( c(k) s(k) ) |
|
* ( -s(k) c(k) ) |
|
* ( 1 ) |
|
* ( ... ) |
|
* ( 1 ) |
|
* |
|
* where R(k) appears as a rank-2 modification to the identity matrix in |
|
* rows and columns k and k+1. |
|
* |
|
* When PIVOT = 'T' (Top pivot), the rotation is performed for the |
|
* plane (1,k+1), so P(k) has the form |
|
* |
|
* P(k) = ( c(k) s(k) ) |
|
* ( 1 ) |
|
* ( ... ) |
|
* ( 1 ) |
|
* ( -s(k) c(k) ) |
|
* ( 1 ) |
|
* ( ... ) |
|
* ( 1 ) |
|
* |
|
* where R(k) appears in rows and columns 1 and k+1. |
|
* |
|
* Similarly, when PIVOT = 'B' (Bottom pivot), the rotation is |
|
* performed for the plane (k,z), giving P(k) the form |
|
* |
|
* P(k) = ( 1 ) |
|
* ( ... ) |
|
* ( 1 ) |
|
* ( c(k) s(k) ) |
|
* ( 1 ) |
|
* ( ... ) |
|
* ( 1 ) |
|
* ( -s(k) c(k) ) |
|
* |
|
* where R(k) appears in rows and columns k and z. The rotations are |
|
* performed without ever forming P(k) explicitly. |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* SIDE (input) CHARACTER*1 |
|
* Specifies whether the plane rotation matrix P is applied to |
|
* A on the left or the right. |
|
* = 'L': Left, compute A := P*A |
|
* = 'R': Right, compute A:= A*P**T |
|
* |
|
* PIVOT (input) CHARACTER*1 |
|
* Specifies the plane for which P(k) is a plane rotation |
|
* matrix. |
|
* = 'V': Variable pivot, the plane (k,k+1) |
|
* = 'T': Top pivot, the plane (1,k+1) |
|
* = 'B': Bottom pivot, the plane (k,z) |
|
* |
|
* DIRECT (input) CHARACTER*1 |
|
* Specifies whether P is a forward or backward sequence of |
|
* plane rotations. |
|
* = 'F': Forward, P = P(z-1)*...*P(2)*P(1) |
|
* = 'B': Backward, P = P(1)*P(2)*...*P(z-1) |
|
* |
|
* M (input) INTEGER |
|
* The number of rows of the matrix A. If m <= 1, an immediate |
|
* return is effected. |
|
* |
|
* N (input) INTEGER |
|
* The number of columns of the matrix A. If n <= 1, an |
|
* immediate return is effected. |
|
* |
|
* C (input) DOUBLE PRECISION array, dimension |
|
* (M-1) if SIDE = 'L' |
|
* (N-1) if SIDE = 'R' |
|
* The cosines c(k) of the plane rotations. |
|
* |
|
* S (input) DOUBLE PRECISION array, dimension |
|
* (M-1) if SIDE = 'L' |
|
* (N-1) if SIDE = 'R' |
|
* The sines s(k) of the plane rotations. The 2-by-2 plane |
|
* rotation part of the matrix P(k), R(k), has the form |
|
* R(k) = ( c(k) s(k) ) |
|
* ( -s(k) c(k) ). |
|
* |
|
* A (input/output) DOUBLE PRECISION array, dimension (LDA,N) |
|
* The M-by-N matrix A. On exit, A is overwritten by P*A if |
|
* SIDE = 'R' or by A*P**T if SIDE = 'L'. |
|
* |
|
* LDA (input) INTEGER |
|
* The leading dimension of the array A. LDA >= max(1,M). |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |
Line 272
|
Line 346
|
END IF |
END IF |
ELSE IF( LSAME( SIDE, 'R' ) ) THEN |
ELSE IF( LSAME( SIDE, 'R' ) ) THEN |
* |
* |
* Form A * P' |
* Form A * P**T |
* |
* |
IF( LSAME( PIVOT, 'V' ) ) THEN |
IF( LSAME( PIVOT, 'V' ) ) THEN |
IF( LSAME( DIRECT, 'F' ) ) THEN |
IF( LSAME( DIRECT, 'F' ) ) THEN |