SRC/dgesvdq.f(3)
π SRC/dgesvdq.f(3) π
Library Functions Manual but make it fashion, bestie. This is the group-chat-friendly tour of SRC/dgesvdq.f, and yes, we are keeping every single technical crumb. π
π NAME
SRC/dgesvdq.f
π οΈ SYNOPSIS
πΈ Functions/Subroutines
subroutine dgesvdq (joba, jobp, jobr, jobu, jobv, m, n, a, lda, s, u, ldu, v, ldv, numrank, iwork, liwork, work, lwork, rwork, lrwork, info)β DGESVDQ computes the singular value decomposition (SVD) with a QR-Preconditioned QR SVD Method for GE matrices π
π Function/Subroutine Documentation
subroutine dgesvdq (character joba, character jobp, character jobr,
character jobu, character jobv, integer m, integer n, double precision,
dimension( lda, * ) a, integer lda, double precision, dimension( * ) s,
double precision, dimension( ldu, * ) u, integer ldu, double precision,
dimension( ldv, * ) v, integer ldv, integer numrank, integer, dimension(
* ) iwork, integer liwork, double precision, dimension( * ) work,
integer lwork, double precision, dimension( * ) rwork, integer lrwork,
integer info)
DGESVDQ computes the singular value decomposition (SVD) with a QR-Preconditioned QR SVD Method for GE matrices. Iconic. β¨
π― Purpose
Okay so DGESVDQ computes the singular value decomposition (SVD) of a real M-by-N matrix A, where M >= N. The SVD of A is written as:
[++] [xx] [x0] [xx]
A = U * SIGMA * V^*, [++] = [xx] * [ox] * [xx]
[++] [xx]
where SIGMA is an N-by-N diagonal matrix, U is an M-by-N orthonormal matrix, and V is an N-by-N orthogonal matrix. The diagonal elements of SIGMA are the singular values of A. The columns of U and V are the left and the right singular vectors of A, respectively. Literally the whole main-character factorization. π
π Parameters
JOBA
JOBA is CHARACTER*1. It specifies the level of accuracy in the computed SVD, bestie.
= 'A'β The requested accuracy corresponds to having the backward error bounded by|| delta A ||_F <= f(m,n) * EPS * || A ||_F, whereEPS = DLAMCH('Epsilon'). This authorises DGESVDQ to truncate the computed triangular factor in a rank revealing QR factorization whenever the truncated part is below the threshold of the order ofEPS * ||A||_F. This is aggressive truncation level. π₯= 'M'β Similarly as with'A', but the truncation is more gentle: it is allowed only when there is a drop on the diagonal of the triangular factor in the QR factorization. This is medium truncation level. πΈ= 'H'β High accuracy requested. No numerical rank determination based on the rank revealing QR factorization is attempted. β¨= 'E'β Same as'H', and in addition the condition number of column scaledAis estimated and returned inRWORK(1).N^(-1/4)*RWORK(1) <= ||pinv(A_scaled)||_2 <= N^(1/4)*RWORK(1)π
JOBP
JOBP is CHARACTER*1.
= 'P'β The rows ofAare ordered in decreasing order with respect to||A(i,:)||_\infty. This enhances numerical accuracy at the cost of extra data movement. Recommended for numerical robustness. π«Ά= 'N'β No row pivoting. π
JOBR
JOBR is CHARACTER*1.
= 'T'β After the initial pivoted QR factorization, DGESVD is applied to the transposedR**Tof the computed triangular factorR. This involves some extra data movement (matrix transpositions). Useful for experiments, research and development. π§= 'N'β The triangular factorRis given as input to DGESVD. This may be preferred as it involves less data movement. π
JOBU
JOBU is CHARACTER*1.
= 'A'β AllMleft singular vectors are computed and returned in the matrixU. See the description ofU. π= 'S'or'U'βN = min(M,N)left singular vectors are computed and returned in the matrixU. See the description ofU. β¨= 'R'β Numerical rankNUMRANKis determined and onlyNUMRANKleft singular vectors are computed and returned in the matrixU. π= 'F'β TheNleft singular vectors are returned in factored form as the product of theQfactor from the initial QR factorization and theNleft singular vectors of(R**T , 0)**T. If row pivoting is used, then the necessary information on the row pivoting is stored inIWORK(N+1:N+M-1). π¦= 'N'β The left singular vectors are not computed. π
JOBV
JOBV is CHARACTER*1.
= 'A', 'V'β AllNright singular vectors are computed and returned in the matrixV. πΈ= 'R'β Numerical rankNUMRANKis determined and onlyNUMRANKright singular vectors are computed and returned in the matrixV.
This option is allowed only ifJOBU = 'R'orJOBU = 'N'; otherwise it is illegal. π¨
= 'N'β The right singular vectors are not computed. π
M
M is INTEGER. The number of rows of the input matrix A. M >= 0. β
N
N is INTEGER. The number of columns of the input matrix A. M >= N >= 0. π
A
A is DOUBLE PRECISION array of dimensions LDA x N.
On entry, the input matrix A.
On exit, if JOBU .NE. 'N' or JOBV .NE. 'N', the lower triangle of A contains the Householder vectors as stored by DGEQP3. If JOBU = 'F', these Householder vectors together with WORK(1:N) can be used to restore the Q factors from the initial pivoted QR factorization of A. See the description of U. π«Ά
LDA
LDA is INTEGER. The leading dimension of the array A. LDA >= max(1,M). π
S
S is DOUBLE PRECISION array of dimension N. The singular values of A, ordered so that S(i) >= S(i+1). π
U
U is DOUBLE PRECISION array, dimension:
LDU x MifJOBU = 'A'; see the description ofLDU. In this case, on exit,Ucontains theMleft singular vectors. πLDU x NifJOBU = 'S', 'U', 'R'; see the description ofLDU. In this case,Ucontains the leadingNor the leadingNUMRANKleft singular vectors. β¨LDU x NifJOBU = 'F'; see the description ofLDU. In this caseUcontainsN x Northogonal matrix that can be used to form the left singular vectors. π¦
If JOBU = 'N', U is not referenced. π
LDU
LDU is INTEGER. The leading dimension of the array U.
- If
JOBU = 'A', 'S', 'U', 'R',LDU >= max(1,M). π - If
JOBU = 'F',LDU >= max(1,N). πΈ - Otherwise,
LDU >= 1. π
V
V is DOUBLE PRECISION array, dimension:
LDV x NifJOBV = 'A', 'V', 'R'or ifJOBA = 'E'. π- If
JOBV = 'A', or'V',Vcontains theN-by-Northogonal matrixV**T. β¨ - If
JOBV = 'R',Vcontains the firstNUMRANKrows ofV**T(the right singular vectors, stored rowwise, of theNUMRANKlargest singular values). π - If
JOBV = 'N'andJOBA = 'E',Vis used as a workspace. π§ - If
JOBV = 'N', andJOBA.NE.'E',Vis not referenced. π
LDV
LDV is INTEGER. The leading dimension of the array V.
- If
JOBV = 'A', 'V', 'R', orJOBA = 'E',LDV >= max(1,N). π - Otherwise,
LDV >= 1. π
NUMRANK
NUMRANK is INTEGER.
NUMRANK is the numerical rank first determined after the rank revealing QR factorization, following the strategy specified by the value of JOBA. If JOBV = 'R' and JOBU = 'R', only NUMRANK leading singular values and vectors are then requested in the call of DGESVD. The final value of NUMRANK might be further reduced if some singular values are computed as zeros. π₯
IWORK
IWORK is INTEGER array, dimension (max(1, LIWORK)).
On exit, IWORK(1:N) contains column pivoting permutation of the rank revealing QR factorization.
If JOBP = 'P', IWORK(N+1:N+M-1) contains the indices of the sequence of row swaps used in row pivoting. These can be used to restore the left singular vectors in the case JOBU = 'F'. π¦
If LIWORK, LWORK, or LRWORK = -1, then on exit, if INFO = 0, IWORK(1) returns the minimal LIWORK. π
LIWORK
LIWORK is INTEGER. The dimension of the array IWORK.
LIWORK >= N + M - 1, ifJOBP = 'P'andJOBA .NE. 'E'; πΈLIWORK >= NifJOBP = 'N'andJOBA .NE. 'E'; πLIWORK >= N + M - 1 + N, ifJOBP = 'P'andJOBA = 'E'; β¨LIWORK >= N + NifJOBP = 'N'andJOBA = 'E'. π
If LIWORK = -1, then a workspace query is assumed; the routine only calculates and returns the optimal and minimal sizes for the WORK, IWORK, and RWORK arrays, and no error message related to LWORK is issued by XERBLA. π¨
WORK
WORK is DOUBLE PRECISION array, dimension (max(2, LWORK)), used as a workspace.
On exit, if, on entry, LWORK.NE.-1, WORK(1:N) contains parameters needed to recover the Q factor from the QR factorization computed by DGEQP3. π
If LIWORK, LWORK, or LRWORK = -1, then on exit, if INFO = 0, WORK(1) returns the optimal LWORK, and WORK(2) returns the minimal LWORK. π
LWORK
LWORK
LWORK is an INTEGER β it's the dimension of the WORK array, and bestie, the way it's determined is a whole little decision tree π³. Here's the exact tea:
LWORK is INTEGER
The dimension of the array WORK. It is determined as follows:
Let LWQP3 = 3*N+1, LWCON = 3*N, and let
LWORQ = { MAX( N, 1 ), if JOBU = 'R', 'S', or 'U'
{ MAX( M, 1 ), if JOBU = 'A'
LWSVD = MAX( 5*N, 1 )
LWLQF = MAX( N/2, 1 ), LWSVD2 = MAX( 5*(N/2), 1 ), LWORLQ = MAX( N, 1 ),
LWQRF = MAX( N/2, 1 ), LWORQ2 = MAX( N, 1 )
Then the minimal value of LWORK is:
= MAX( N + LWQP3, LWSVD ) if only the singular values are needed;
= MAX( N + LWQP3, LWCON, LWSVD ) if only the singular values are needed,
and a scaled condition estimate requested;
= N + MAX( LWQP3, LWSVD, LWORQ ) if the singular values and the left
singular vectors are requested;
= N + MAX( LWQP3, LWCON, LWSVD, LWORQ ) if the singular values and the left
singular vectors are requested, and also
a scaled condition estimate requested;
= N + MAX( LWQP3, LWSVD ) if the singular values and the right
singular vectors are requested;
= N + MAX( LWQP3, LWCON, LWSVD ) if the singular values and the right
singular vectors are requested, and also
a scaled condition etimate requested;
= N + MAX( LWQP3, LWSVD, LWORQ ) if the full SVD is requested with JOBV = 'R';
independent of JOBR;
= N + MAX( LWQP3, LWCON, LWSVD, LWORQ ) if the full SVD is requested,
JOBV = 'R' and, also a scaled condition
estimate requested; independent of JOBR;
= MAX( N + MAX( LWQP3, LWSVD, LWORQ ),
N + MAX( LWQP3, N/2+LWLQF, N/2+LWSVD2, N/2+LWORLQ, LWORQ) ) if the
full SVD is requested with JOBV = 'A' or 'V', and
JOBR ='N'
= MAX( N + MAX( LWQP3, LWCON, LWSVD, LWORQ ),
N + MAX( LWQP3, LWCON, N/2+LWLQF, N/2+LWSVD2, N/2+LWORLQ, LWORQ ) )
if the full SVD is requested with JOBV = 'A' or 'V', and
JOBR ='N', and also a scaled condition number estimate
requested.
= MAX( N + MAX( LWQP3, LWSVD, LWORQ ),
N + MAX( LWQP3, N/2+LWQRF, N/2+LWSVD2, N/2+LWORQ2, LWORQ ) ) if the
full SVD is requested with JOBV = 'A', 'V', and JOBR ='T'
= MAX( N + MAX( LWQP3, LWCON, LWSVD, LWORQ ),
N + MAX( LWQP3, LWCON, N/2+LWQRF, N/2+LWSVD2, N/2+LWORQ2, LWORQ ) )
if the full SVD is requested with JOBV = 'A' or 'V', and
JOBR ='T', and also a scaled condition number estimate
requested.
Finally, LWORK must be at least two: LWORK = MAX( 2, LWORK ).
If LWORK = -1, then a workspace query is assumed; the routine
only calculates and returns the optimal and minimal sizes
for the WORK, IWORK, and RWORK arrays, and no error
message related to LWORK is issued by XERBLA.
Translation for the group chat:LWORKhas to be at leastMAX( 2, LWORK )after all that, and if you passLWORK = -1it's a workspace query β it only hands back the optimal and minimal sizes forWORK,IWORK, andRWORK, andXERBLAdoesn't pop off aboutLWORKπ₯.
RWORK
RWORK is a DOUBLE PRECISION array, dimension (max(1, LRWORK)) π. On exit:
- If
JOBA = 'E',RWORK(1)contains an estimate of the condition number of column scaledA. IfA = C * DwhereDis diagonal andChas unit columns in the Euclidean norm, then, assuming full column rank,N^(-1/4) * RWORK(1) <= ||pinv(C)||_2 <= N^(1/4) * RWORK(1). Otherwise,RWORK(1) = -1. RWORK(2)contains the number of singular values computed as exact zeros inDGESVDapplied to the upper triangular or trapezoidalR(from the initial QR factorization). In case of early exit (no call toDGESVD, such as in the case of zero matrix)RWORK(2) = -1.
If LIWORK, LWORK, or LRWORK = -1, then on exit, if INFO = 0, RWORK(1) returns the minimal LRWORK π.
LRWORK
LRWORK is an INTEGER β the dimension of the RWORK array πΈ.
- If
JOBP ='P', thenLRWORK >= MAX(2, M). - Otherwise,
LRWORK >= 2.
If LRWORK = -1, then a workspace query is assumed; the routine only calculates and returns the optimal and minimal sizes for the WORK, IWORK, and RWORK arrays, and no error message related to LWORK is issued by XERBLA π.
INFO
INFO is an INTEGER, and it's giving status-report energy π
:
= 0: successful exit.< 0: ifINFO = -i, thei-th argument had an illegal value.> 0: ifDBDSQRdid not converge,INFOspecifies how many superdiagonals of an intermediate bidiagonal formB(computed inDGESVD) did not converge to zero.
β¨ Further Details β¨
- The data movement (matrix transpose) is coded using simple nested
DO-loops because BLAS and LAPACK do not provide corresponding subroutines. ThoseDO-loops are easily identified in this source code β by theCONTINUEstatements labeled with11**. In an optimized version of this code, the nestedDOloops should be replaced with calls to an optimized subroutine. - This code scales
Aby1/SQRT(M)if the largestABS(A(i,j))could cause column norm overflow. This is the minimal precaution, and it is left to the SVD routine (CGESVD) to do its own preemptive scaling if potential over- or underflows are detected. To avoid repeated scanning of the arrayA, an optimal implementation would do all necessary scaling before callingCGESVDand the scaling inCGESVDcan be switched off. - Other comments related to code optimization are given in comments in the code, enclosed in
[[double brackets]].
π Bugs, examples and comments π
Please report all bugs and send interesting examples and/or comments to drmac@math.hr. Thank you! π«Ά
π References π
- [1] Zlatko Drmac, Algorithm 977: A QR-Preconditioned QR SVD Method for Computing the SVD with High Accuracy. ACM Trans. Math. Softw. 44(1): 11:1-11:30 (2017)
SIGMA library, xGESVDQ section updated February 2016. Developed and coded by Zlatko Drmac, Department of Mathematics University of Zagreb, Croatia, drmac@math.hr π¦
π Contributors π
Developed and coded by Zlatko Drmac, Department of Mathematics University of Zagreb, Croatia, drmac@math.hr π
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Definition at line 412 of file dgesvdq.f β
Author: Generated automatically by Doxygen for LAPACK from the source code.
That's the whole vibe, bestie π β LAPACK Version 3.12.0, SRC/dgesvdq.f(3). The footer doesn't show a separate date, so I'm not making one up ππ
.
π¦ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms