SRC/DEPRECATED/sgegv.f(3)
okay so welcome to the Library Functions Manual, section (3) β and yes, we're looking at SRC/DEPRECATED/sgegv.f, which is lowkey living in the deprecated folder but still ate π
β¨
π NAME π
bestie, the name is literally SRC/DEPRECATED/sgegv.f. that's it. that's the whole name. no cap. π«Ά
β¨ SYNOPSIS β¨
π Functions/Subroutines
the main character here is one subroutine, and here's its exact signature β don't come for me, I'm copying it character for character:
subroutine sgegv (jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta,
vl, ldvl, vr, ldvr, work, lwork, info)
and what does this icon do? SGEGV computes the eigenvalues and, optionally, the left and/or right eigenvectors of a real matrix pair (A,B). periodt. π
π subroutine sgegv π
subroutine sgegv (character jobvl, character jobvr, integer n, real,
dimension( lda, * ) a, integer lda, real, dimension( ldb, * ) b, integer
ldb, real, dimension( * ) alphar, real, dimension( * ) alphai, real,
dimension( * ) beta, real, dimension( ldvl, * ) vl, integer ldvl, real,
dimension( ldvr, * ) vr, integer ldvr, real, dimension( * ) work,
integer lwork, integer info)
okay so like, SGEGV computes the eigenvalues and, optionally, the left and/or right eigenvectors of a real matrix pair (A,B). it's giving classic overachiever energy, honestly β¨
π― PURPOSE π―
β οΈ bestie, listen: this routine is deprecated and has been replaced by routineSGGEV. so yeah, it's iconic but it's also kinda retired. useSGGEVfor new stuff, mwah π
SGEGV computes the eigenvalues and, optionally, the left and/or right eigenvectors of a real matrix pair (A,B).
given two square matrices A and B, the generalized nonsymmetric eigenvalue problem (GNEP) is to find the eigenvalues lambda and corresponding (non-zero) eigenvectors x such that
A*x = lambda*B*x.
an alternate form is to find the eigenvalues mu and corresponding eigenvectors y such that
mu*A*y = B*y.
these two forms are equivalent with mu = 1/lambda and x = y if neither lambda nor mu is zero. in order to deal with the case that lambda or mu is zero or small, two values alpha and beta are returned for each eigenvalue, such that lambda = alpha/beta and mu = beta/alpha. math girlies stay winning π
the vectors x and y in the above equations are right eigenvectors of the matrix pair (A,B). vectors u and v satisfying
u**H*A = lambda*u**H*B or mu*v**H*A = v**H*B
are left eigenvectors of (A,B).
note: this routine performs on A and B π«Ά
πΈ PARAMETERS πΈ
JOBVLβ okay soJOBVLisCHARACTER*1and it's literally your left-eigenvector vibe check:= 'N': do not compute the left generalized eigenvectors. we're not doing left energy today, and that's valid π= 'V': compute the left generalized eigenvectors (returned inVL). left queen behavior π
JOBVRβJOBVRisCHARACTER*1, same deal but for the right side:= 'N': do not compute the right generalized eigenvectors. no right vibes, no problem.= 'V': compute the right generalized eigenvectors (returned inVR). slay, right bestie π
NβNisINTEGER, and it's the order of the matricesA,B,VL, andVR. literallyN >= 0. no cap.AβAisREAL array, dimension (LDA, N). on entry, the matrixA. on exit things get spicy:- if
JOBVL = 'V'orJOBVR = 'V', then on exitAcontains the real Schur form ofAfrom the generalized Schur factorization of the pair(A,B)after balancing. it's giving glow-up β¨ - if no eigenvectors were computed, then only the diagonal blocks from the Schur form will be correct. the rest is giving "we don't know her" π
- see
SGGHRDandSHGEQZfor details. iykyk.
- if
LDAβLDAisINTEGER, the leading dimension ofA. and it's gotta beLDA >= max(1,N). rules are rules, bestie.BβBisREAL array, dimension (LDB, N). on entry, the matrixB. on exit:- if
JOBVL = 'V'orJOBVR = 'V', then on exitBcontains the upper triangular matrix obtained fromBin the generalized Schur factorization of the pair(A,B)after balancing. triangular and thriving π - if no eigenvectors were computed, then only those elements of
Bcorresponding to the diagonal blocks from the Schur form ofAwill be correct. selective correctness, honestly iconic. - see
SGGHRDandSHGEQZfor details.
- if
LDBβLDBisINTEGER, the leading dimension ofB. andLDB >= max(1,N). periodt.ALPHARβALPHARisREAL array, dimension (N). the real parts of each scalaralphadefining an eigenvalue of GNEP. real-part representation πALPHAIβALPHAIisREAL array, dimension (N). the imaginary parts of each scalaralphadefining an eigenvalue of GNEP. and here's the tea:- if
ALPHAI(j)is zero, then the j-th eigenvalue is real. simple, real, unbothered. - if positive, then the j-th and (j+1)-st eigenvalues are a complex conjugate pair, with
ALPHAI(j+1) = -ALPHAI(j). complex conjugate duo, main character energy π
- if
BETAβBETAisREAL array, dimension (N). the scalarsbetathat define the eigenvalues of GNEP. together, the quantitiesalpha = (ALPHAR(j),ALPHAI(j))andbeta = BETA(j)represent the j-th eigenvalue of the matrix pair(A,B), in one of the formslambda = alpha/betaormu = beta/alpha. and bestie, listen: since eitherlambdaormumay overflow, they should not, in general, be computed. so like, don't do it. danger vibes πVLβVLisREAL array, dimension (LDVL,N). ifJOBVL = 'V', the left eigenvectorsu(j)are stored in the columns ofVL, in the same order as their eigenvalues. here's the storage lore:- if the j-th eigenvalue is real, then
u(j) = VL(:,j). - if the j-th and (j+1)-st eigenvalues form a complex conjugate pair, then
u(j) = VL(:,j) + i*VL(:,j+1)andu(j+1) = VL(:,j) - i*VL(:,j+1). - each eigenvector is scaled so that its largest component has
abs(real part) + abs(imag. part) = 1, except for eigenvectors corresponding to an eigenvalue withalpha = beta = 0, which are set to zero. zeroed out, respectfully. - not referenced if
JOBVL = 'N'. if you said no, she stays unread π΅
- if the j-th eigenvalue is real, then
LDVLβLDVLisINTEGER, the leading dimension of the matrixVL.LDVL >= 1, and ifJOBVL = 'V',LDVL >= N. conditional slay.VRβVRisREAL array, dimension (LDVR,N). ifJOBVR = 'V', the right eigenvectorsx(j)are stored in the columns ofVR, in the same order as their eigenvalues. same rules, right side:- if the j-th eigenvalue is real, then
x(j) = VR(:,j). - if the j-th and (j+1)-st eigenvalues form a complex conjugate pair, then
x(j) = VR(:,j) + i*VR(:,j+1)andx(j+1) = VR(:,j) - i*VR(:,j+1). - each eigenvector is scaled so that its largest component has
abs(real part) + abs(imag. part) = 1, except for eigenvalues corresponding to an eigenvalue withalpha = beta = 0, which are set to zero. - not referenced if
JOBVR = 'N'. no right energy? no data.
- if the j-th eigenvalue is real, then
LDVRβLDVRisINTEGER, the leading dimension of the matrixVR.LDVR >= 1, and ifJOBVR = 'V',LDVR >= N. periodt.WORKβWORKisREAL array, dimension (MAX(1,LWORK)). on exit, ifINFO = 0,WORK(1)returns the optimalLWORK. the workspace bestie we all need πLWORKβLWORKisINTEGER, the dimension of the arrayWORK. and babe, the rules are:LWORK >= max(1,8*N). minimum effort, literally.- for good performance,
LWORKmust generally be larger. do more, get more, glow more β¨ - to compute the optimal value of
LWORK, callILAENVto get blocksizes (forSGEQRF,SORMQR, andSORGQR.) then compute:NBβ MAX of the blocksizes forSGEQRF,SORMQR, andSORGQR;- the optimal
LWORKis:2*N + MAX( 6*N, N*(NB+1) ).
- if
LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. a sneaky little peek, no error drama.
INFOβINFOisINTEGER, the status tea:= 0: successful exit. we ate and left no crumbs π< 0: ifINFO = -i, the i-th argument had an illegal value. someone broke a rule, not me though.= 1,...,N: the QZ iteration failed. no eigenvectors have been calculated, butALPHAR(j),ALPHAI(j), andBETA(j)should be correct forj=INFO+1,...,N. partial success is still success-ish π> N: errors that usually indicate LAPACK problems:=N+1: error return fromSGGBAL=N+2: error return fromSGEQRF=N+3: error return fromSORMQR=N+4: error return fromSORGQR=N+5: error return fromSGGHRD=N+6: error return fromSHGEQZ(other than failed iteration)=N+7: error return fromSTGEVC=N+8: error return fromSGGBAK(computingVL)=N+9: error return fromSGGBAK(computingVR)=N+10: error return fromSLASCL(various calls)
π§ AUTHOR π§
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
okay so like, a whole academic friend group wrote this. collective slay π«Ά
π₯ FURTHER DETAILS π₯
β¨ Balancing β¨
this driver calls SGGBAL to both permute and scale rows and columns of A and B. the permutations PL and PR are chosen so that PL*A*PR and PL*B*R will be upper triangular except for the diagonal blocks A(i:j,i:j) and B(i:j,i:j), with i and j as close together as possible. the diagonal scaling matrices DL and DR are chosen so that the pair DL*PL*A*PR*DR, DL*PL*B*PR*DR have elements close to one (except for the elements that start out zero.) it's giving organized chaos, honestly π
after the eigenvalues and eigenvectors of the balanced matrices have been computed, SGGBAK transforms the eigenvectors back to what they would have been (in perfect arithmetic) if they had not been balanced. reverse glow-up, no cap β¨
π Contents of A and B on Exit π
if any eigenvectors are computed (either JOBVL='V' or JOBVR='V' or both), then on exit the arrays A and B will contain the real Schur form[*] of the versions of A and B. if no eigenvectors are computed, then only the diagonal blocks will be correct.
[*] See SHGEQZ, SGEGS, or read the book , by Golub & van Loan, pub. by Johns Hopkins U. Press. book rec, bestie π
definition at line 304 of file sgegv.f.
generated automatically by Doxygen for LAPACK from the source code. it's giving robot-made but make it cute π€π
LAPACK Version 3.12.0 β SRC/DEPRECATED/sgegv.f(3) β byeee, stay slaying those matrices, bestie! π β¨ππ¦πΈπ
π¦ 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