SRC/ctgsja.f(3)
π SRC/ctgsja.f β Library Functions Manual, section 3 π
okay bestie, welcome to the Library Functions Manual corner of the internet, specifically section 3 β the one where all the library calls live. today's main character is SRC/ctgsja.f, and she is a whole moment. β¨
πΈ NAME πΈ
SRC/ctgsja.f β that's it, that's the name, no further notes. the file itself is the vibe. π
not me giving this entry a personality before the DESCRIPTION section even shows up π β but we're going in order, so sit tight, the good stuff is coming.
π₯ SYNOPSIS π₯
π« Functions/Subroutines π«
so the star of the show, the one, the only:
subroutine ctgsja (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)
CTGSJA
likeβ¦ look at that parameter list. twenty-five arguments, no cap. she's highkey extra and we love that for her. π«Ά
let's do a lil vibe check on the cast, in the exact order they walk in (no descriptions yet β we're just doing introductions, the lore drops in the next part):
jobujobvjobqmpnklaldabldbtolatolbalphabetaulduvldvqldqworkncycleinfo
and the name on the door is CTGSJA, capital letters, all caps, main character energy only. π
π¦ quick heads up bestie: this page is long, so the DESCRIPTION and everything after it is chilling in the next part. don't touch that dial. π
π Function/Subroutine Documentation π
subroutine ctgsja (character jobu, character jobv, character jobq, integer
m, integer p, integer n, integer k, integer l, complex, dimension( lda,
* ) a, integer lda, complex, dimension( ldb, * ) b, integer ldb, real
tola, real tolb, real, dimension( * ) alpha, real, dimension( * ) beta,
complex, dimension( ldu, * ) u, integer ldu, complex, dimension( ldv, *
) v, integer ldv, complex, dimension( ldq, * ) q, integer ldq, complex,
dimension( * ) work, integer ncycle, integer info)
π CTGSJA π
πΈ Purpose πΈ
Okay bestie, hereβs the tea: CTGSJA computes the generalized singular value decomposition (GSVD) of two complex upper triangular (or trapezoidal) matrices A and B. Iconic behavior, honestly.
On entry, it is assumed that matrices A and B have the following forms, which may be obtained by the preprocessing subroutine CGGSVP 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.
On exit, β¨ the whole vibe transforms β¨:
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.
π Parameters π
JOBUβJOBUisCHARACTER*1. Choose your fighter:= 'U': U must contain a unitary matrix U1 on entry, and the product U1*U is returned;= 'I': U is initialized to the unit matrix, and the unitary matrix U is returned;= 'N': U is not computed.
JOBVβJOBVisCHARACTER*1. Same energy, different letter:= 'V': V must contain a unitary matrix V1 on entry, and the product V1*V is returned;= 'I': V is initialized to the unit matrix, and the unitary matrix V is returned;= 'N': V is not computed.
JOBQβJOBQisCHARACTER*1. Q gets a turn too:= 'Q': Q must contain a unitary matrix Q1 on entry, and the product Q1*Q is returned;= 'I': Q is initialized to the unit matrix, and the unitary matrix Q is returned;= 'N': Q is not computed.
MβMisINTEGER. The number of rows of the matrixA.M >= 0.PβPisINTEGER. The number of rows of the matrixB.P >= 0.NβNisINTEGER. The number of columns of the matricesAandB.N >= 0.KβKisINTEGER.LβLisINTEGER.
K and L specify the subblocks in the input matrices A and B: A23 = A(K+1:MIN(K+L,M),N-L+1:N) and B13 = B(1:L,,N-L+1:N) of A and B, whose GSVD is going to be computed by CTGSJA. See Further Details.
AβAisCOMPLEXarray, dimension(LDA,N). On entry, theM-by-NmatrixA. On exit,A(N-K+1:N,1:MIN(K+L,M) )contains the triangular matrixRor part ofR. See Purpose for details.LDAβLDAisINTEGER. The leading dimension of the arrayA.LDA >= max(1,M).BβBisCOMPLEXarray, dimension(LDB,N). On entry, theP-by-NmatrixB. On exit, if necessary,B(M-K+1:L,N+M-K-L+1:N)contains a part ofR. See Purpose for details.LDBβLDBisINTEGER. The leading dimension of the arrayB.LDB >= max(1,P).TOLAβTOLAisREAL.TOLBβTOLBisREAL.
TOLA and TOLB are 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)*MACHEPS,
TOLB = MAX(P,N)*norm(B)*MACHEPS.
ALPHAβALPHAisREALarray, dimension(N).BETAβBETAisREALarray, dimension(N).
On exit, ALPHA and BETA contain the generalized singular value pairs of A and B;
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
BETA(K+L+1:N) = 0.
UβUisCOMPLEXarray, dimension(LDU,M). On entry, ifJOBU = 'U',Umust contain a matrixU1(usually the unitary matrix returned byCGGSVP). On exit, ifJOBU = 'I',Ucontains the unitary matrixU; ifJOBU = 'U',Ucontains the productU1*U. IfJOBU = 'N',Uis not referenced.LDUβLDUisINTEGER. The leading dimension of the arrayU.LDU >= max(1,M)ifJOBU = 'U';LDU >= 1otherwise.VβVisCOMPLEXarray, dimension(LDV,P). On entry, ifJOBV = 'V',Vmust contain a matrixV1(usually the unitary matrix returned byCGGSVP). On exit, ifJOBV = 'I',Vcontains the unitary matrixV; ifJOBV = 'V',Vcontains the productV1*V. IfJOBV = 'N',Vis not referenced.LDVβLDVisINTEGER. The leading dimension of the arrayV.LDV >= max(1,P)ifJOBV = 'V';LDV >= 1otherwise.QβQisCOMPLEXarray, dimension(LDQ,N). On entry, ifJOBQ = 'Q',Qmust contain a matrixQ1(usually the unitary matrix returned byCGGSVP). On exit, ifJOBQ = 'I',Qcontains the unitary matrixQ; ifJOBQ = 'Q',Qcontains the productQ1*Q. IfJOBQ = 'N',Qis not referenced.LDQβLDQisINTEGER. The leading dimension of the arrayQ.LDQ >= max(1,N)ifJOBQ = 'Q';LDQ >= 1otherwise.WORKβWORKisCOMPLEXarray, dimension(2*N).NCYCLEβNCYCLEisINTEGER. The number of cycles required for convergence.INFOβINFOisINTEGER.= 0: successful exit< 0: ifINFO = -i, the i-th argument had an illegal value.= 1: the procedure does not converge afterMAXITcycles.
π₯ Internal Parameters π₯
MAXITβMAXITisINTEGER.MAXITspecifies the total loops that the iterative procedure may take. If afterMAXITcycles, the routine fails to converge, we returnINFO = 1.
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π¦ Further Details π¦
CTGSJA essentially uses a variant of Kogbetliantz algorithm to reduce min(L,M-K)-by-L triangular (or trapezoidal) matrix A23 and 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.
Definition at line 376 of file ctgsja.f.
β¨ AUTHOR β¨
Okay so real talk β nobody actually wrote this page by hand, bestie. It was generated automatically by Doxygen for LAPACK straight from the source code. π Like, the robots did the typing, we just added the vibes. π
Generated automatically by Doxygen for LAPACK from the source code.
So if you're out here like "who do I thank for this masterpiece?" β it's the source code and a doc generator, no cap. π«Ά
And that's the whole page, bestie β you made it to the end! π This iconic little number is from LAPACK, Version 3.12.0, and it lives its best life at SRC/ctgsja.f(3). Go forth and compute, you absolute main character. ππ
π¦ 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