version 1.2, 2010/04/21 13:45:20
|
version 1.20, 2023/08/07 08:38:59
|
Line 1
|
Line 1
|
|
*> \brief \b DLASDQ computes the SVD of a real bidiagonal matrix with diagonal d and off-diagonal e. Used by sbdsdc. |
|
* |
|
* =========== DOCUMENTATION =========== |
|
* |
|
* Online html documentation available at |
|
* http://www.netlib.org/lapack/explore-html/ |
|
* |
|
*> \htmlonly |
|
*> Download DLASDQ + dependencies |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlasdq.f"> |
|
*> [TGZ]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlasdq.f"> |
|
*> [ZIP]</a> |
|
*> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlasdq.f"> |
|
*> [TXT]</a> |
|
*> \endhtmlonly |
|
* |
|
* Definition: |
|
* =========== |
|
* |
|
* SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, |
|
* U, LDU, C, LDC, WORK, INFO ) |
|
* |
|
* .. Scalar Arguments .. |
|
* CHARACTER UPLO |
|
* INTEGER INFO, LDC, LDU, LDVT, N, NCC, NCVT, NRU, SQRE |
|
* .. |
|
* .. Array Arguments .. |
|
* DOUBLE PRECISION C( LDC, * ), D( * ), E( * ), U( LDU, * ), |
|
* $ VT( LDVT, * ), WORK( * ) |
|
* .. |
|
* |
|
* |
|
*> \par Purpose: |
|
* ============= |
|
*> |
|
*> \verbatim |
|
*> |
|
*> DLASDQ computes the singular value decomposition (SVD) of a real |
|
*> (upper or lower) bidiagonal matrix with diagonal D and offdiagonal |
|
*> E, accumulating the transformations if desired. Letting B denote |
|
*> the input bidiagonal matrix, the algorithm computes orthogonal |
|
*> matrices Q and P such that B = Q * S * P**T (P**T denotes the transpose |
|
*> of P). The singular values S are overwritten on D. |
|
*> |
|
*> The input matrix U is changed to U * Q if desired. |
|
*> The input matrix VT is changed to P**T * VT if desired. |
|
*> The input matrix C is changed to Q**T * C if desired. |
|
*> |
|
*> See "Computing Small Singular Values of Bidiagonal Matrices With |
|
*> Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, |
|
*> LAPACK Working Note #3, for a detailed description of the algorithm. |
|
*> \endverbatim |
|
* |
|
* Arguments: |
|
* ========== |
|
* |
|
*> \param[in] UPLO |
|
*> \verbatim |
|
*> UPLO is CHARACTER*1 |
|
*> On entry, UPLO specifies whether the input bidiagonal matrix |
|
*> is upper or lower bidiagonal, and whether it is square are |
|
*> not. |
|
*> UPLO = 'U' or 'u' B is upper bidiagonal. |
|
*> UPLO = 'L' or 'l' B is lower bidiagonal. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] SQRE |
|
*> \verbatim |
|
*> SQRE is INTEGER |
|
*> = 0: then the input matrix is N-by-N. |
|
*> = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and |
|
*> (N+1)-by-N if UPLU = 'L'. |
|
*> |
|
*> The bidiagonal matrix has |
|
*> N = NL + NR + 1 rows and |
|
*> M = N + SQRE >= N columns. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] N |
|
*> \verbatim |
|
*> N is INTEGER |
|
*> On entry, N specifies the number of rows and columns |
|
*> in the matrix. N must be at least 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] NCVT |
|
*> \verbatim |
|
*> NCVT is INTEGER |
|
*> On entry, NCVT specifies the number of columns of |
|
*> the matrix VT. NCVT must be at least 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] NRU |
|
*> \verbatim |
|
*> NRU is INTEGER |
|
*> On entry, NRU specifies the number of rows of |
|
*> the matrix U. NRU must be at least 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in] NCC |
|
*> \verbatim |
|
*> NCC is INTEGER |
|
*> On entry, NCC specifies the number of columns of |
|
*> the matrix C. NCC must be at least 0. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] D |
|
*> \verbatim |
|
*> D is DOUBLE PRECISION array, dimension (N) |
|
*> On entry, D contains the diagonal entries of the |
|
*> bidiagonal matrix whose SVD is desired. On normal exit, |
|
*> D contains the singular values in ascending order. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] E |
|
*> \verbatim |
|
*> E is DOUBLE PRECISION array. |
|
*> dimension is (N-1) if SQRE = 0 and N if SQRE = 1. |
|
*> On entry, the entries of E contain the offdiagonal entries |
|
*> of the bidiagonal matrix whose SVD is desired. On normal |
|
*> exit, E will contain 0. If the algorithm does not converge, |
|
*> D and E will contain the diagonal and superdiagonal entries |
|
*> of a bidiagonal matrix orthogonally equivalent to the one |
|
*> given as input. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] VT |
|
*> \verbatim |
|
*> VT is DOUBLE PRECISION array, dimension (LDVT, NCVT) |
|
*> On entry, contains a matrix which on exit has been |
|
*> premultiplied by P**T, dimension N-by-NCVT if SQRE = 0 |
|
*> and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDVT |
|
*> \verbatim |
|
*> LDVT is INTEGER |
|
*> On entry, LDVT specifies the leading dimension of VT as |
|
*> declared in the calling (sub) program. LDVT must be at |
|
*> least 1. If NCVT is nonzero LDVT must also be at least N. |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] U |
|
*> \verbatim |
|
*> U is DOUBLE PRECISION array, dimension (LDU, N) |
|
*> On entry, contains a matrix which on exit has been |
|
*> postmultiplied by Q, dimension NRU-by-N if SQRE = 0 |
|
*> and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDU |
|
*> \verbatim |
|
*> LDU is INTEGER |
|
*> On entry, LDU specifies the leading dimension of U as |
|
*> declared in the calling (sub) program. LDU must be at |
|
*> least max( 1, NRU ) . |
|
*> \endverbatim |
|
*> |
|
*> \param[in,out] C |
|
*> \verbatim |
|
*> C is DOUBLE PRECISION array, dimension (LDC, NCC) |
|
*> On entry, contains an N-by-NCC matrix which on exit |
|
*> has been premultiplied by Q**T dimension N-by-NCC if SQRE = 0 |
|
*> and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0). |
|
*> \endverbatim |
|
*> |
|
*> \param[in] LDC |
|
*> \verbatim |
|
*> LDC is INTEGER |
|
*> On entry, LDC specifies the leading dimension of C as |
|
*> declared in the calling (sub) program. LDC must be at |
|
*> least 1. If NCC is nonzero, LDC must also be at least N. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] WORK |
|
*> \verbatim |
|
*> WORK is DOUBLE PRECISION array, dimension (4*N) |
|
*> Workspace. Only referenced if one of NCVT, NRU, or NCC is |
|
*> nonzero, and if N is at least 2. |
|
*> \endverbatim |
|
*> |
|
*> \param[out] INFO |
|
*> \verbatim |
|
*> INFO is INTEGER |
|
*> On exit, a value of 0 indicates a successful exit. |
|
*> If INFO < 0, argument number -INFO is illegal. |
|
*> If INFO > 0, the algorithm did not converge, and INFO |
|
*> specifies how many superdiagonals did not converge. |
|
*> \endverbatim |
|
* |
|
* Authors: |
|
* ======== |
|
* |
|
*> \author Univ. of Tennessee |
|
*> \author Univ. of California Berkeley |
|
*> \author Univ. of Colorado Denver |
|
*> \author NAG Ltd. |
|
* |
|
*> \ingroup OTHERauxiliary |
|
* |
|
*> \par Contributors: |
|
* ================== |
|
*> |
|
*> Ming Gu and Huan Ren, Computer Science Division, University of |
|
*> California at Berkeley, USA |
|
*> |
|
* ===================================================================== |
SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, |
SUBROUTINE DLASDQ( UPLO, SQRE, N, NCVT, NRU, NCC, D, E, VT, LDVT, |
$ U, LDU, C, LDC, WORK, INFO ) |
$ U, LDU, C, LDC, WORK, INFO ) |
* |
* |
* -- LAPACK auxiliary routine (version 3.2) -- |
* -- LAPACK auxiliary routine -- |
* -- 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 |
|
* |
* |
* .. Scalar Arguments .. |
* .. Scalar Arguments .. |
CHARACTER UPLO |
CHARACTER UPLO |
Line 15
|
Line 222
|
$ VT( LDVT, * ), WORK( * ) |
$ VT( LDVT, * ), WORK( * ) |
* .. |
* .. |
* |
* |
* Purpose |
|
* ======= |
|
* |
|
* DLASDQ computes the singular value decomposition (SVD) of a real |
|
* (upper or lower) bidiagonal matrix with diagonal D and offdiagonal |
|
* E, accumulating the transformations if desired. Letting B denote |
|
* the input bidiagonal matrix, the algorithm computes orthogonal |
|
* matrices Q and P such that B = Q * S * P' (P' denotes the transpose |
|
* of P). The singular values S are overwritten on D. |
|
* |
|
* The input matrix U is changed to U * Q if desired. |
|
* The input matrix VT is changed to P' * VT if desired. |
|
* The input matrix C is changed to Q' * C if desired. |
|
* |
|
* See "Computing Small Singular Values of Bidiagonal Matrices With |
|
* Guaranteed High Relative Accuracy," by J. Demmel and W. Kahan, |
|
* LAPACK Working Note #3, for a detailed description of the algorithm. |
|
* |
|
* Arguments |
|
* ========= |
|
* |
|
* UPLO (input) CHARACTER*1 |
|
* On entry, UPLO specifies whether the input bidiagonal matrix |
|
* is upper or lower bidiagonal, and wether it is square are |
|
* not. |
|
* UPLO = 'U' or 'u' B is upper bidiagonal. |
|
* UPLO = 'L' or 'l' B is lower bidiagonal. |
|
* |
|
* SQRE (input) INTEGER |
|
* = 0: then the input matrix is N-by-N. |
|
* = 1: then the input matrix is N-by-(N+1) if UPLU = 'U' and |
|
* (N+1)-by-N if UPLU = 'L'. |
|
* |
|
* The bidiagonal matrix has |
|
* N = NL + NR + 1 rows and |
|
* M = N + SQRE >= N columns. |
|
* |
|
* N (input) INTEGER |
|
* On entry, N specifies the number of rows and columns |
|
* in the matrix. N must be at least 0. |
|
* |
|
* NCVT (input) INTEGER |
|
* On entry, NCVT specifies the number of columns of |
|
* the matrix VT. NCVT must be at least 0. |
|
* |
|
* NRU (input) INTEGER |
|
* On entry, NRU specifies the number of rows of |
|
* the matrix U. NRU must be at least 0. |
|
* |
|
* NCC (input) INTEGER |
|
* On entry, NCC specifies the number of columns of |
|
* the matrix C. NCC must be at least 0. |
|
* |
|
* D (input/output) DOUBLE PRECISION array, dimension (N) |
|
* On entry, D contains the diagonal entries of the |
|
* bidiagonal matrix whose SVD is desired. On normal exit, |
|
* D contains the singular values in ascending order. |
|
* |
|
* E (input/output) DOUBLE PRECISION array. |
|
* dimension is (N-1) if SQRE = 0 and N if SQRE = 1. |
|
* On entry, the entries of E contain the offdiagonal entries |
|
* of the bidiagonal matrix whose SVD is desired. On normal |
|
* exit, E will contain 0. If the algorithm does not converge, |
|
* D and E will contain the diagonal and superdiagonal entries |
|
* of a bidiagonal matrix orthogonally equivalent to the one |
|
* given as input. |
|
* |
|
* VT (input/output) DOUBLE PRECISION array, dimension (LDVT, NCVT) |
|
* On entry, contains a matrix which on exit has been |
|
* premultiplied by P', dimension N-by-NCVT if SQRE = 0 |
|
* and (N+1)-by-NCVT if SQRE = 1 (not referenced if NCVT=0). |
|
* |
|
* LDVT (input) INTEGER |
|
* On entry, LDVT specifies the leading dimension of VT as |
|
* declared in the calling (sub) program. LDVT must be at |
|
* least 1. If NCVT is nonzero LDVT must also be at least N. |
|
* |
|
* U (input/output) DOUBLE PRECISION array, dimension (LDU, N) |
|
* On entry, contains a matrix which on exit has been |
|
* postmultiplied by Q, dimension NRU-by-N if SQRE = 0 |
|
* and NRU-by-(N+1) if SQRE = 1 (not referenced if NRU=0). |
|
* |
|
* LDU (input) INTEGER |
|
* On entry, LDU specifies the leading dimension of U as |
|
* declared in the calling (sub) program. LDU must be at |
|
* least max( 1, NRU ) . |
|
* |
|
* C (input/output) DOUBLE PRECISION array, dimension (LDC, NCC) |
|
* On entry, contains an N-by-NCC matrix which on exit |
|
* has been premultiplied by Q' dimension N-by-NCC if SQRE = 0 |
|
* and (N+1)-by-NCC if SQRE = 1 (not referenced if NCC=0). |
|
* |
|
* LDC (input) INTEGER |
|
* On entry, LDC specifies the leading dimension of C as |
|
* declared in the calling (sub) program. LDC must be at |
|
* least 1. If NCC is nonzero, LDC must also be at least N. |
|
* |
|
* WORK (workspace) DOUBLE PRECISION array, dimension (4*N) |
|
* Workspace. Only referenced if one of NCVT, NRU, or NCC is |
|
* nonzero, and if N is at least 2. |
|
* |
|
* INFO (output) INTEGER |
|
* On exit, a value of 0 indicates a successful exit. |
|
* If INFO < 0, argument number -INFO is illegal. |
|
* If INFO > 0, the algorithm did not converge, and INFO |
|
* specifies how many superdiagonals did not converge. |
|
* |
|
* Further Details |
|
* =============== |
|
* |
|
* Based on contributions by |
|
* Ming Gu and Huan Ren, Computer Science Division, University of |
|
* California at Berkeley, USA |
|
* |
|
* ===================================================================== |
* ===================================================================== |
* |
* |
* .. Parameters .. |
* .. Parameters .. |