SRC/ztgsja.f(3)
πΈ SRC/ztgsja.f(3) β Library Functions Manual πΈ
okay bestie, this is the (3) manual page for SRC/ztgsja.f, and it's giving big numerical linear algebra energy. No cap, we're keeping the whole routine, every flag, every matrix, every warning. π«Ά
β¨ NAME β¨
SRC/ztgsja.f
π 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
π Function/Subroutine Documentation π
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. Main character math, honestly. π
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. iykyk, the shape lore is real. π¦
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. periodt, that detail stays. β¨
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. obsessed with the flexibility, honestly. π
π Parameters π
JOBUβJOBUisCHARACTER*1.
= '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.
= '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': 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 ZTGSJA. See Further Details. yes, that double comma is literally in the original β not me, bestie. π
AβAisCOMPLEX*16array, 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. the way that output slice is doing the most. πLDAβLDAisINTEGER. The leading dimension of the arrayA.LDA >= max(1,M).BβBisCOMPLEX*16array, 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βLDBisINTEGER. The leading dimension of the arrayB.LDB >= max(1,P).TOLAβTOLAisDOUBLE PRECISION.TOLBβTOLBisDOUBLE PRECISION.
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)*MAZHEPS,
TOLB = MAX(P,N)*norm(B)*MAZHEPS.
ALPHAβALPHAisDOUBLE PRECISIONarray, dimension(N).BETAβBETAisDOUBLE PRECISIONarray, 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 and
BETA(K+L+1:N) = 0.
UβUisCOMPLEX*16array, 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βLDUisINTEGER. The leading dimension of the arrayU.LDU >= max(1,M)ifJOBU = 'U';LDU >= 1otherwise.VβVisCOMPLEX*16array, 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βLDVisINTEGER. The leading dimension of the arrayV.LDV >= max(1,P)ifJOBV = 'V';LDV >= 1otherwise.QβQisCOMPLEX*16array, 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βLDQisINTEGER. The leading dimension of the arrayQ.LDQ >= max(1,N)ifJOBQ = 'Q';LDQ >= 1otherwise.WORKβWORKisCOMPLEX*16array, dimension(2*N).NCYCLEβNCYCLEisINTEGER. The number of cycles required for convergence.INFOβINFOisINTEGER.
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal value.
= 1: the procedure does not converge after MAXIT cycles.
π₯ Internal Parameters π₯
MAXITβINTEGER.
MAXIT specifies the total loops that the iterative procedure may take. If after MAXIT cycles, the routine fails to converge, we return INFO = 1. bestie, that's the "it did not slay" exit. π
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π¦ Further Details π¦
(no body in this part of the source page)
okay so bestie, here's the actual tea on what ZTGSJA is doing under the hood β it 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 this form:
U1**H *A13*Q1 = C1*R1; V1**H *B13*Q1 = S1*R1,
where U1, V1 and Q1 are unitary matrix. (Yes, the original says "matrix" β we're keeping it exactly like that, no cap. π«Ά)
C1 and S1 are diagonal matrices satisfying
C1**2 + S1**2 = I,
and R1 is an L-by-L nonsingular upper triangular matrix. periodt. π
Definition at line 376 of file ztgsja.f.
β¨ Author β¨
Generated automatically by Doxygen for LAPACK from the source code.
mwah π this iconic little page was brought to you by LAPACK Version 3.12.0, straight from SRC/ztgsja.f(3). slay. πβ¨
π¦ 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