ZTGSJA(3)
π ZTGSJA(3) π
okay so welcome to ZTGSJA(3) β the LAPACK page for the routine that does the most: it computes the generalized singular value decomposition (GSVD) of two complex upper triangular (or trapezoidal) matrices. yes that's a mouthful, yes it's iconic, no you don't have to say it out loud. let's get into it β¨
π NAME π
/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/ztgsja.f
that's the file, that's the name, that's the whole vibe π
π SYNOPSIS π
Functions/Subroutines
subroutine ZTGSJA (jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb,
tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq, work, ncycle, info)
ZTGSJA β the main character of this entire page, no cap π«Ά
π Function/Subroutine Documentation π
π subroutine ZTGSJA π
here's the full signature bestie, every type and every dimension spec, exactly as it is:
subroutine ZTGSJA (character jobu, character jobv, character jobq, integer
m, integer p, integer n, integer k, integer l, complex*16, dimension(
lda, * ) a, integer lda, complex*16, dimension( ldb, * ) b, integer ldb,
double precision tola, double precision tolb, double precision,
dimension( * ) alpha, double precision, dimension( * ) beta, complex*16,
dimension( ldu, * ) u, integer ldu, complex*16, dimension( ldv, * ) v,
integer ldv, complex*16, dimension( ldq, * ) q, integer ldq, complex*16,
dimension( * ) work, integer ncycle, integer info)
ZTGSJA π¦
β¨ Purpose β¨
ZTGSJA computes the generalized singular value decomposition (GSVD) of two complex upper triangular (or trapezoidal) matrices A and B. like, that's literally the job, and it ate π₯
on entry, it is assumed that matrices A and B have the following forms, which may be obtained by the preprocessing subroutine ZGGSVP from a general M-by-N matrix A and P-by-N matrix B:
N-K-L K L
A = K ( 0 A12 A13 ) if M-K-L >= 0;
L ( 0 0 A23 )
M-K-L ( 0 0 0 )
N-K-L K L
A = K ( 0 A12 A13 ) if M-K-L < 0;
M-K ( 0 0 A23 )
N-K-L K L
B = L ( 0 0 B13 )
P-L ( 0 0 0 )
where the K-by-K matrix A12 and L-by-L matrix B13 are nonsingular upper triangular; A23 is L-by-L upper triangular if M-K-L >= 0, otherwise A23 is (M-K)-by-L upper trapezoidal. got it? slay πΈ
on exit:
U**H *A*Q = D1*( 0 R ), V**H *B*Q = D2*( 0 R ),
where U, V and Q are unitary matrices. R is a nonsingular upper triangular matrix, and D1 and D2 are ``diagonal'' matrices, which are of the following structures:
if M-K-L >= 0,
K L
D1 = K ( I 0 )
L ( 0 C )
M-K-L ( 0 0 )
K L
D2 = L ( 0 S )
P-L ( 0 0 )
N-K-L K L
( 0 R ) = K ( 0 R11 R12 ) K
L ( 0 0 R22 ) L
where
C = diag( ALPHA(K+1), ... , ALPHA(K+L) ),
S = diag( BETA(K+1), ... , BETA(K+L) ),
C**2 + S**2 = I.
R is stored in A(1:K+L,N-K-L+1:N) on exit.
if M-K-L < 0,
K M-K K+L-M
D1 = K ( I 0 0 )
M-K ( 0 C 0 )
K M-K K+L-M
D2 = M-K ( 0 S 0 )
K+L-M ( 0 0 I )
P-L ( 0 0 0 )
N-K-L K M-K K+L-M
( 0 R ) = K ( 0 R11 R12 R13 )
M-K ( 0 0 R22 R23 )
K+L-M ( 0 0 0 R33 )
where
C = diag( ALPHA(K+1), ... , ALPHA(M) ),
S = diag( BETA(K+1), ... , BETA(M) ),
C**2 + S**2 = I.
R = ( R11 R12 R13 ) is stored in A(1:M, N-K-L+1:N) and R33 is stored
( 0 R22 R23 )
in B(M-K+1:L,N+M-K-L+1:N) on exit.
the computation of the unitary transformation matrices U, V or Q is optional. these matrices may either be formed explicitly, or they may be postmultiplied into input matrices U1, V1, or Q1. your call, bestie, both are valid π
π¦ Parameters π¦
JOBUβJOBU is CHARACTER*1= 'U':Umust contain a unitary matrixU1on entry, and the productU1*Uis returned;= 'I':Uis initialized to the unit matrix, and the unitary matrixUis returned;= 'N':Uis not computed.
JOBVβJOBV is CHARACTER*1= 'V':Vmust contain a unitary matrixV1on entry, and the productV1*Vis returned;= 'I':Vis initialized to the unit matrix, and the unitary matrixVis returned;= 'N':Vis not computed.
JOBQβJOBQ is CHARACTER*1= 'Q':Qmust contain a unitary matrixQ1on entry, and the productQ1*Qis returned;= 'I':Qis initialized to the unit matrix, and the unitary matrixQis returned;= 'N':Qis not computed.
MβM is INTEGER. the number of rows of the matrixA.M >= 0.PβP is INTEGER. the number of rows of the matrixB.P >= 0.NβN is INTEGER. the number of columns of the matricesAandB.N >= 0.KβK is INTEGER. (that's it, that's the whole description, she's mysterious like that π)LβL is INTEGER.KandLspecify the subblocks in the input matricesAandB:A23 = A(K+1:MIN(K+L,M),N-L+1:N)andB13 = B(1:L,,N-L+1:N)ofAandB, whose GSVD is going to be computed byZTGSJA. see Further Details. (yes that double comma in there is literally in the original, we don't touch it, periodt π)AβA is COMPLEX*16 array, dimension (LDA,N). on entry, the M-by-N matrixA. on exit,A(N-K+1:N,1:MIN(K+L,M) )contains the triangular matrixRor part ofR. see Purpose for details.LDAβLDA is INTEGER. the leading dimension of the arrayA.LDA >= max(1,M).BβB is COMPLEX*16 array, dimension (LDB,N). on entry, the P-by-N matrixB. on exit, if necessary,B(M-K+1:L,N+M-K-L+1:N)contains a part ofR. see Purpose for details.LDBβLDB is INTEGER. the leading dimension of the arrayB.LDB >= max(1,P).TOLAβTOLA is DOUBLE PRECISION. (iconic, no notes)TOLBβTOLB is DOUBLE PRECISION.TOLAandTOLBare the convergence criteria for the Jacobi-Kogbetliantz iteration procedure. generally, they are the same as used in the preprocessing step, say
TOLA = MAX(M,N)*norm(A)*MAZHEPS,
TOLB = MAX(P,N)*norm(B)*MAZHEPS.
ALPHAβALPHA is DOUBLE PRECISION array, dimension (N).BETAβBETA is DOUBLE PRECISION array, dimension (N). on exit,ALPHAandBETAcontain the generalized singular value pairs ofAandB;
ALPHA(1:K) = 1,
BETA(1:K) = 0,
and if M-K-L >= 0,
ALPHA(K+1:K+L) = diag(C),
BETA(K+1:K+L) = diag(S),
or if M-K-L < 0,
ALPHA(K+1:M)= C, ALPHA(M+1:K+L)= 0
BETA(K+1:M) = S, BETA(M+1:K+L) = 1.
furthermore, if K+L < N,
ALPHA(K+L+1:N) = 0 and
BETA(K+L+1:N) = 0.
UβU is COMPLEX*16 array, dimension (LDU,M). on entry, ifJOBU = 'U',Umust contain a matrixU1(usually the unitary matrix returned byZGGSVP). on exit, ifJOBU = 'I',Ucontains the unitary matrixU; ifJOBU = 'U',Ucontains the productU1*U. ifJOBU = 'N',Uis not referenced.LDUβLDU is INTEGER. the leading dimension of the arrayU.LDU >= max(1,M)ifJOBU = 'U';LDU >= 1otherwise.VβV is COMPLEX*16 array, dimension (LDV,P). on entry, ifJOBV = 'V',Vmust contain a matrixV1(usually the unitary matrix returned byZGGSVP). on exit, ifJOBV = 'I',Vcontains the unitary matrixV; ifJOBV = 'V',Vcontains the productV1*V. ifJOBV = 'N',Vis not referenced.LDVβLDV is INTEGER. the leading dimension of the arrayV.LDV >= max(1,P)ifJOBV = 'V';LDV >= 1otherwise.QβQ is COMPLEX*16 array, dimension (LDQ,N). on entry, ifJOBQ = 'Q',Qmust contain a matrixQ1(usually the unitary matrix returned byZGGSVP). on exit, ifJOBQ = 'I',Qcontains the unitary matrixQ; ifJOBQ = 'Q',Qcontains the productQ1*Q. ifJOBQ = 'N',Qis not referenced.LDQβLDQ is INTEGER. the leading dimension of the arrayQ.LDQ >= max(1,N)ifJOBQ = 'Q';LDQ >= 1otherwise.WORKβWORK is COMPLEX*16 array, dimension (2*N). (that's the whole description, she said what she said π)NCYCLEβNCYCLE is INTEGER. the number of cycles required for convergence.INFOβINFO is INTEGER= 0: successful exit< 0: ifINFO = -i, the i-th argument had an illegal value.= 1: the procedure does not converge afterMAXITcycles.
π Internal Parameters π
MAXITβINTEGER.MAXITspecifies the total loops that the iterative procedure may take. if afterMAXITcycles, the routine fails to converge, we returnINFO = 1. so like, that's the deadline, and she WILL report you if you miss it π
π Author π
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π§ Further Details π§
(okay bestie this section is literally empty in the original β the further details are giving nothing yet, more incoming in part 2 πβ¨π)
...and that's the whole vibe of the reduction π bestie, let me break the math down for you because it's lowkey iconic:
ZTGSJA essentially uses a variant of the Kogbetliantz algorithm to reduce a min(L,M-K)-by-L triangular (or trapezoidal) matrix A23 and an L-by-L matrix B13 to the form:
U1**H *A13*Q1 = C1*R1; V1**H *B13*Q1 = S1*R1,
where U1, V1 and Q1 are unitary matrix. π
C1 and S1 are diagonal matrices satisfying
C1**2 + S1**2 = I,
and R1 is an L-by-L nonsingular upper triangular matrix. Periodt. β¨
Ngl the way C1**2 + S1**2 = I just works out is giving main character energy β it's literally the whole point of the reduction, so don't sleep on it π«Ά
Definition at line 376 of file ztgsja.f. (iykyk β that's where the magic lives, fr fr π)
π Author π
Generated automatically by Doxygen for LAPACK from the source code. Not me being a Doxygen-generated girlypop π β yes, the docs wrote themselves, we just made them cute.
β¨ cute little sign-off β¨
That's a wrap bestie! π¦ This lil masterpiece is from LAPACK, Version 3.12.0, straight out of /home/abui...RC/ztgsja.f(3) β go forth and reduce those matrices, you absolute icon ππΈπ
π¦ where this page comes from
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- opensuse-leap 16.0: lapack-man 3.12.0-160000.2.2 Β· BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms