trevc3(3)
β¨ NAME β¨
trevc3 β eigenvectors of triangular Schur form, blocked π
(and yes bestie, this is the trevc3(3) page, straight out of the Library Functions Manual β we are deep in library-functions territory today π«Ά)
π SYNOPSIS π
π Functions
subroutine ctrevc3 (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, rwork, lrwork, info)β the complex single-precision one, aka CTREVC3subroutine dtrevc3 (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, info)β the double-precision real one, aka DTREVC3subroutine strevc3 (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, info)β the single-precision real one, aka STREVC3subroutine ztrevc3 (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, rwork, lrwork, info)β the complex double-precision one, aka ZTREVC3
π¦ Detailed Description
okay so real talk β this whole page is about one job: getting eigenvectors out of a triangular (or quasi-triangular) matrix that's already sitting in Schur form. Every routine down below does the same thing, just for a different flavour of number. Below you'll find the full docs for each one, in order π
π Function Documentation π
π§ subroutine ctrevc3
subroutine ctrevc3 (character side, character howmny, logical, dimension( * ) select, integer n, complex, dimension( ldt, * ) t, integer ldt, complex, dimension( ldvl, * ) vl, integer ldvl, complex, dimension( ldvr, * ) vr, integer ldvr, integer mm, integer m, complex, dimension( * ) work, integer lwork, real, dimension( * ) rwork, integer lrwork, integer info)
π CTREVC3
Purpose:
CTREVC3 computes some or all of the right and/or left eigenvectors of a complex upper triangular matrix T. π
Matrices of this type are produced by the Schur factorization of a complex general matrix: A = Q*T*Q**H, as computed by CHSEQR. slay.
The right eigenvector x and the left eigenvector y of T corresponding to an eigenvalue w are defined by:
T*x = w*x, (y**H)*T = w*(y**H)
where y**H denotes the conjugate transpose of the vector y. The eigenvalues are not input to this routine, but are read directly from the diagonal of T. (yes, it just peeks at the diagonal, iconic behaviour π)
This routine returns the matrices X and/or Y of right and left eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an input matrix. If Q is the unitary factor that reduces a matrix A to Schur form T, then Q*X and Q*Y are the matrices of right and left eigenvectors of A.
This uses a Level 3 BLAS version of the back transformation. π₯
πΈ Parameters
SIDEβSIDE is CHARACTER*1= 'R': compute right eigenvectors only;= 'L': compute left eigenvectors only;= 'B': compute both right and left eigenvectors.
HOWMNYβHOWMNY is CHARACTER*1= 'A': compute all right and/or left eigenvectors;= 'B': compute all right and/or left eigenvectors, backtransformed using the matrices supplied inVRand/orVL;= 'S': compute selected right and/or left eigenvectors, as indicated by the logical arraySELECT.
SELECTβSELECT is LOGICAL array, dimension (N)IfHOWMNY = 'S',SELECTspecifies the eigenvectors to be computed. The eigenvector corresponding to the j-th eigenvalue is computed ifSELECT(j) = .TRUE.. Not referenced ifHOWMNY = 'A'or'B'.NβN is INTEGERThe order of the matrixT.N >= 0.TβT is COMPLEX array, dimension (LDT,N)The upper triangular matrixT. β οΈTis modified, but restored on exit. (so like, it goes through a phase and then comes back, don't worry π )LDTβLDT is INTEGERThe leading dimension of the arrayT.LDT >= max(1,N).VLβVL is COMPLEX array, dimension (LDVL,MM)On entry, ifSIDE = 'L'or'B'andHOWMNY = 'B',VLmust contain an N-by-N matrixQ(usually the unitary matrixQof Schur vectors returned byCHSEQR). On exit, ifSIDE = 'L'or'B',VLcontains:- if
HOWMNY = 'A', the matrixYof left eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*Y; - if
HOWMNY = 'S', the left eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVL, in the same order as their eigenvalues.
- if
Not referenced if SIDE = 'R'.
LDVLβLDVL is INTEGERThe leading dimension of the arrayVL.LDVL >= 1, and ifSIDE = 'L'or'B',LDVL >= N.VRβVR is COMPLEX array, dimension (LDVR,MM)On entry, ifSIDE = 'R'or'B'andHOWMNY = 'B',VRmust contain an N-by-N matrixQ(usually the unitary matrixQof Schur vectors returned byCHSEQR). On exit, ifSIDE = 'R'or'B',VRcontains:- if
HOWMNY = 'A', the matrixXof right eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*X; - if
HOWMNY = 'S', the right eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVR, in the same order as their eigenvalues.
- if
Not referenced if SIDE = 'L'.
LDVRβLDVR is INTEGERThe leading dimension of the arrayVR.LDVR >= 1, and ifSIDE = 'R'or'B',LDVR >= N.MMβMM is INTEGERThe number of columns in the arraysVLand/orVR.MM >= M.MβM is INTEGERThe number of columns in the arraysVLand/orVRactually used to store the eigenvectors. IfHOWMNY = 'A'or'B',Mis set toN. Each selected eigenvector occupies one column.WORKβWORK is COMPLEX array, dimension (MAX(1,LWORK))LWORKβLWORK is INTEGERThe dimension of arrayWORK.LWORK >= max(1,2*N). For optimum performance,LWORK >= N + 2*N*NB, whereNBis the optimal blocksize. π―
IfLWORK = -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. (the -1 hack, we love her π)
RWORKβRWORK is REAL array, dimension (LRWORK)LRWORKβLRWORK is INTEGERThe dimension of arrayRWORK.LRWORK >= max(1,N).
IfLRWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theRWORKarray, returns this value as the first entry of theRWORKarray, and no error message related toLRWORKis issued byXERBLA.
INFOβINFO is INTEGER= 0: successful exit β¨< 0: ifINFO = -i, the i-th argument had an illegal value
π«Ά Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
β Further Details:
The algorithm used in this program is basically backward (forward) substitution, with scaling to make the the code robust against possible overflow. π€
Each eigenvector is normalized so that the element of largest magnitude has magnitude 1; here the magnitude of a complex number (x,y) is taken to be |x| + |y|.
Definition at line 242 of file ctrevc3.f. π
π¦ subroutine dtrevc3
subroutine dtrevc3 (character side, character howmny, logical, dimension( * ) select, integer n, double precision, dimension( ldt, * ) t, integer ldt, double precision, dimension( ldvl, * ) vl, integer ldvl, double precision, dimension( ldvr, * ) vr, integer ldvr, integer mm, integer m, double precision, dimension( * ) work, integer lwork, integer info)
π DTREVC3
Purpose:
DTREVC3 computes some or all of the right and/or left eigenvectors of a real upper quasi-triangular matrix T. π
Matrices of this type are produced by the Schur factorization of a real general matrix: A = Q*T*Q**T, as computed by DHSEQR.
The right eigenvector x and the left eigenvector y of T corresponding to an eigenvalue w are defined by:
T*x = w*x, (y**T)*T = w*(y**T)
where y**T denotes the transpose of the vector y. The eigenvalues are not input to this routine, but are read directly from the diagonal blocks of T. (blocks, bestie β real Schur form keeps its 2-by-2s, no cap π)
This routine returns the matrices X and/or Y of right and left eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an input matrix. If Q is the orthogonal factor that reduces a matrix A to Schur form T, then Q*X and Q*Y are the matrices of right and left eigenvectors of A.
This uses a Level 3 BLAS version of the back transformation. π₯
πΈ Parameters
SIDEβSIDE is CHARACTER*1= 'R': compute right eigenvectors only;= 'L': compute left eigenvectors only;= 'B': compute both right and left eigenvectors.
HOWMNYβHOWMNY is CHARACTER*1= 'A': compute all right and/or left eigenvectors;= 'B': compute all right and/or left eigenvectors, backtransformed by the matrices inVRand/orVL;= 'S': compute selected right and/or left eigenvectors, as indicated by the logical arraySELECT.
π SELECT
β¦and that's exactly where part 1 of this page dips out, so hold that thought β SELECT is literally mid-sentence π
SELECTβ aLOGICALarray, dimension(N). Bestie, this is your little checklist of which eigenvectors you actually want π IfHOWMNY = 'S',SELECTspecifies the eigenvectors to be computed. Ifw(j)is a real eigenvalue, the corresponding real eigenvector is computed ifSELECT(j)is.TRUE.. Ifw(j)andw(j+1)are the real and imaginary parts of a complex eigenvalue, the corresponding complex eigenvector is computed if eitherSELECT(j)orSELECT(j+1)is.TRUE., and on exitSELECT(j)is set to.TRUE.andSELECT(j+1)is set to.FALSE.. Not referenced ifHOWMNY = 'A'or'B'. (So lowkey it tidies up after itself, iconic behavior tbh β¨)NβINTEGER. The order of the matrixT.N >= 0. No cap, but also it can literally be zero, she's flexible πTβDOUBLE PRECISIONarray, dimension(LDT,N). The upper quasi-triangular matrixTin Schur canonical form. This is the main character of the whole situation, fr fr πLDTβINTEGER. The leading dimension of the arrayT.LDT >= max(1,N). Respect the leading dimension or the whole thing gets messy, ngl.VLβDOUBLE PRECISIONarray, dimension(LDVL,MM). Okay so on entry, ifSIDE = 'L'or'B'andHOWMNY = 'B',VLmust contain anN-by-NmatrixQ(usually the orthogonal matrixQof Schur vectors returned byDHSEQR). On exit, ifSIDE = 'L'or'B',VLcontains:- if
HOWMNY = 'A', the matrixYof left eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*Y; - if
HOWMNY = 'S', the left eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVL, in the same order as their eigenvalues.
- if
A complex eigenvector corresponding to a complex eigenvalue is stored in two consecutive columns, the first holding the real part, and the second the imaginary part. Not referenced if SIDE = 'R'. Two columns, one real one imag β she's splitting the vibe across two slots π¦
LDVLβINTEGER. The leading dimension of the arrayVL.LDVL >= 1, and ifSIDE = 'L'or'B',LDVL >= N. Conditional requirements, we love a queen with rules πVRβDOUBLE PRECISIONarray, dimension(LDVR,MM). On entry, ifSIDE = 'R'or'B'andHOWMNY = 'B',VRmust contain anN-by-NmatrixQ(usually the orthogonal matrixQof Schur vectors returned byDHSEQR). On exit, ifSIDE = 'R'or'B',VRcontains:- if
HOWMNY = 'A', the matrixXof right eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*X; - if
HOWMNY = 'S', the right eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVR, in the same order as their eigenvalues.
- if
A complex eigenvector corresponding to a complex eigenvalue is stored in two consecutive columns, the first holding the real part and the second the imaginary part. Not referenced if SIDE = 'L'. Same energy as VL but right-side, obviously πΈ
LDVRβINTEGER. The leading dimension of the arrayVR.LDVR >= 1, and ifSIDE = 'R'or'B',LDVR >= N. Yes the pattern is the pattern, don't come for her π«ΆMMβINTEGER. The number of columns in the arraysVLand/orVR.MM >= M. It's the capacity,Mis what actually gets used β think of it as the shelf versus what's on the shelf πMβINTEGER. The number of columns in the arraysVLand/orVRactually used to store the eigenvectors. IfHOWMNY = 'A'or'B',Mis set toN. Each selected real eigenvector occupies one column and each selected complex eigenvector occupies two columns. So yeah, complex ones take double the closet space, that's just how it is πWORKβDOUBLE PRECISIONarray, dimension(MAX(1,LWORK)). The scratch space. Give her room to breathe β¨LWORKβINTEGER. The dimension of arrayWORK.LWORK >= max(1,3*N). For optimum performance,LWORK >= N + 2*N*NB, whereNBis the optimal blocksize. Like, the minimum works, but the performance version is serving π₯
If LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. It's giving "just tell me how much space you need, I'm not mad" π
INFOβINTEGER. The glow-up report card:= 0: successful exit π< 0: ifINFO = -i, the i-th argument had an illegal value π
Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
All the academic baddies collaborated on this one, we stan a collective π
Further Details:
Okay so the lore: the algorithm used in this program is basically backward (forward) substitution, with scaling to make the the code robust against possible overflow. (Yes, "the the" β the original said it like that, I'm not correcting her, she's doing her best π)
Each eigenvector is normalized so that the element of largest magnitude has magnitude 1; here the magnitude of a complex number (x,y) is taken to be |x| + |y|. So the big one gets scaled down to 1, and for complex numbers the "size" is just the two parts added up β that's the whole rule, no cap β¨
Definition at line 235 of file dtrevc3.f.
STREVC3 π
subroutine strevc3 (character side, character howmny, logical, dimension( *
) select, integer n, real, dimension( ldt, * ) t, integer ldt, real,
dimension( ldvl, * ) vl, integer ldvl, real, dimension( ldvr, * ) vr,
integer ldvr, integer mm, integer m, real, dimension( * ) work, integer
lwork, integer info)
Purpose:
STREVC3 computes some or all of the right and/or left eigenvectors of a real upper quasi-triangular matrix T. Matrices of this type are produced by the Schur factorization of a real general matrix: A = Q*T*Q**T, as computed by SHSEQR. So she's the single-precision sibling and she's also booked and busy π
The right eigenvector x and the left eigenvector y of T corresponding to an eigenvalue w are defined by:
T*x = w*x, (y**T)*T = w*(y**T)
where y**T denotes the transpose of the vector y. The eigenvalues are not input to this routine, but are read directly from the diagonal blocks of T. So she doesn't need you to hand her the eigenvalues, she finds them herself. independent queen behavior π
This routine returns the matrices X and/or Y of right and left eigenvectors of T, or the products Q*X and/or Q*Y, where Q is an input matrix. If Q is the orthogonal factor that reduces a matrix A to Schur form T, then Q*X and Q*Y are the matrices of right and left eigenvectors of A.
This uses a Level 3 BLAS version of the back transformation. Level 3 BLAS is the fast one, we love efficiency π
Parameters
SIDEβCHARACTER*1. Which side are we serving today:= 'R': compute right eigenvectors only;= 'L': compute left eigenvectors only;= 'B': compute both right and left eigenvectors.
Choose your fighter, or honestly just pick 'B' and get both π«Ά
HOWMNYβCHARACTER*1. The how-many switch, and there are exactly three modes:= 'A': compute all right and/or left eigenvectors;= 'B': compute all right and/or left eigenvectors, backtransformed by the matrices inVRand/orVL;= 'S': compute selected right and/or left eigenvectors, as indicated by the logical arraySELECT.
A, B, or S β all, backtransformed, or selected. Periodt β¨
SELECTβLOGICALarray, dimension(N). IfHOWMNY = 'S',SELECTspecifies the eigenvectors to be computed. Ifw(j)is a real eigenvalue, the corresponding real eigenvector is computed ifSELECT(j)is.TRUE.. Ifw(j)andw(j+1)are the real and imaginary parts of a complex eigenvalue, the corresponding complex eigenvector is computed if eitherSELECT(j)orSELECT(j+1)is.TRUE., and on exitSELECT(j)is set to.TRUE.andSELECT(j+1)is set to.FALSE.. Not referenced ifHOWMNY = 'A'or'B'. Also note she does her own cleanup on exit, which is honestly so considerate of her πNβINTEGER. The order of the matrixT.N >= 0. Zero is allowed, she's not gonna judge.TβREALarray, dimension(LDT,N). The upper quasi-triangular matrixTin Schur canonical form. The moment, the icon, the legend πLDTβINTEGER. The leading dimension of the arrayT.LDT >= max(1,N). Yes the same rule as before, because math is consistent like that πVLβREALarray, dimension(LDVL,MM). On entry, ifSIDE = 'L'or'B'andHOWMNY = 'B',VLmust contain anN-by-NmatrixQ(usually the orthogonal matrixQof Schur vectors returned bySHSEQR). On exit, ifSIDE = 'L'or'B',VLcontains:- if
HOWMNY = 'A', the matrixYof left eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*Y; - if
HOWMNY = 'S', the left eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVL, in the same order as their eigenvalues.
- if
A complex eigenvector corresponding to a complex eigenvalue is stored in two consecutive columns, the first holding the real part, and the second the imaginary part. Not referenced if SIDE = 'R'. Two columns again, real then imag, we been knew π¦
LDVLβINTEGER. The leading dimension of the arrayVL.LDVL >= 1, and ifSIDE = 'L'or'B',LDVL >= N. Conditional constraint, she's conditional about it πVRβREALarray, dimension(LDVR,MM). On entry, ifSIDE = 'R'or'B'andHOWMNY = 'B',VRmust contain anN-by-NmatrixQ(usually the orthogonal matrixQof Schur vectors returned bySHSEQR). On exit, ifSIDE = 'R'or'B',VRcontains:- if
HOWMNY = 'A', the matrixXof right eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*X; - if
HOWMNY = 'S', the right eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVR, in the same order as their eigenvalues.
- if
A complex eigenvector corresponding to a complex eigenvalue is stored in two consecutive columns, the first holding the real part and the second the imaginary part. Not referenced if SIDE = 'L'. Mirror image of VL, matching set, so cute πΈ
LDVRβLDVRβ INTEGER, the leading dimension of the arrayVR. Rules:LDVR >= 1, and ifSIDE = 'R'or'B', thenLDVR >= N. β¨MMβ INTEGER, the number of columns in the arraysVLand/orVR. Bestie,MM >= M. That's the whole vibe. πMβ INTEGER, the number of columns inVLand/orVRthat are actually used to store the eigenvectors (the real ones, not the wishful ones). IfHOWMNY = 'A'or'B', thenMis set toN. And the counting tea β: each selected real eigenvector occupies one column, and each selected complex eigenvector occupies two columns. Not me stressing about column budget πWORKβ REAL array, dimension(MAX(1,LWORK)). That's it, that's the whole description. π«ΆLWORKβ INTEGER, the dimension of arrayWORK. SoLWORK >= max(1,3*N). For optimum performance tho (highkey worth it),LWORK >= N + 2*N*NB, whereNBis the optimal blocksize. π₯
And the iconic little trick: if LWORK = -1, then a workspace query is assumed β the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. No cap, it's just asking for the size, it's not doing the math. π
INFOβ INTEGER, the receipts:= 0: successful exit β¨< 0: ifINFO = -i, the i-th argument had an illegal value π
π Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π Further Details:
The algorithm used in this program is basically backward (forward) substitution, with scaling to make the the code robust against possible overflow.
(yes, "the the", she said it, we're keeping it, it's canon π)
Each eigenvector is normalized so that the element of largest magnitude has magnitude 1; here the magnitude of a complex number(x,y)is taken to be|x| + |y|.
That's the norm they're using β |x| + |y|, not the fancy Euclidean one. Note it, bestie. π
Definition at line 235 of file strevc3.f.
π¦ subroutine ztrevc3
Ok so now we're in the complex girlie era and she is serving. Signature, exactly as written:
subroutine ztrevc3 (character side, character howmny, logical, dimension( *
) select, integer n, complex*16, dimension( ldt, * ) t, integer ldt,
complex*16, dimension( ldvl, * ) vl, integer ldvl, complex*16,
dimension( ldvr, * ) vr, integer ldvr, integer mm, integer m,
complex*16, dimension( * ) work, integer lwork, double precision,
dimension( * ) rwork, integer lrwork, integer info)
ZTREVC3 π
β¨ Purpose:
ZTREVC3computes some or all of the right and/or left eigenvectors of a complex upper triangular matrixT. Matrices of this type are produced by the Schur factorization of a complex general matrix:A = Q*T*Q**H, as computed byZHSEQR.
So like, ZHSEQR hands you T, and this routine does the eigenvector thing. Chain of command, iykyk. π
The right eigenvectorxand the left eigenvectoryofTcorresponding to an eigenvalueware defined by:
T*x = w*x, (y**H)*T = w*(y**H)
wherey**Hdenotes the conjugate transpose of the vectory. The eigenvalues are not input to this routine, but are read directly from the diagonal ofT.
Read that again, bestie β the eigenvalues are not input to this routine. They're literally just sitting on the diagonal of T the whole time. Main character energy π
This routine returns the matricesXand/orYof right and left eigenvectors ofT, or the productsQ*Xand/orQ*Y, whereQis an input matrix. IfQis the unitary factor that reduces a matrixAto Schur formT, thenQ*XandQ*Yare the matrices of right and left eigenvectors ofA.
This uses a Level 3 BLAS version of the back transformation.
Level 3 BLAS back transformation β she's fast and she's pretty. Obsessed. π₯
π Parameters
SIDEβCHARACTER*1, choose your fighter:= 'R': compute right eigenvectors only;= 'L': compute left eigenvectors only;= 'B': compute both right and left eigenvectors. π«Ά
HOWMNYβCHARACTER*1, the "how much" knob:= 'A': compute all right and/or left eigenvectors;= 'B': compute all right and/or left eigenvectors, backtransformed using the matrices supplied inVRand/orVL;= 'S': compute selected right and/or left eigenvectors, as indicated by the logical arraySELECT.
SELECTβLOGICALarray, dimension(N). IfHOWMNY = 'S',SELECTspecifies the eigenvectors to be computed. The eigenvector corresponding to the j-th eigenvalue is computed ifSELECT(j) = .TRUE.. Not referenced ifHOWMNY = 'A'or'B'. πNβINTEGER, the order of the matrixT.N >= 0.TβCOMPLEX*16array, dimension(LDT,N). The upper triangular matrixT. Heads up β οΈ:Tis modified, but restored on exit. So she rummages through your matrix and puts everything back exactly where she found it. Iconic, honestly. β¨LDTβINTEGER, the leading dimension of the arrayT.LDT >= max(1,N).VLβCOMPLEX*16array, dimension(LDVL,MM).- On entry, if
SIDE = 'L'or'B'andHOWMNY = 'B',VLmust contain anN-by-NmatrixQ(usually the unitary matrixQof Schur vectors returned byZHSEQR). - On exit, if
SIDE = 'L'or'B',VLcontains:- if
HOWMNY = 'A', the matrixYof left eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*Y; - if
HOWMNY = 'S', the left eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVL, in the same order as their eigenvalues.
- if
- Not referenced if
SIDE = 'R'. π
- On entry, if
LDVLβINTEGER, the leading dimension of the arrayVL.LDVL >= 1, and ifSIDE = 'L'or'B',LDVL >= N.VRβCOMPLEX*16array, dimension(LDVR,MM).- On entry, if
SIDE = 'R'or'B'andHOWMNY = 'B',VRmust contain anN-by-NmatrixQ(usually the unitary matrixQof Schur vectors returned byZHSEQR). - On exit, if
SIDE = 'R'or'B',VRcontains:- if
HOWMNY = 'A', the matrixXof right eigenvectors ofT; - if
HOWMNY = 'B', the matrixQ*X; - if
HOWMNY = 'S', the right eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVR, in the same order as their eigenvalues.
- if
- Not referenced if
SIDE = 'L'. π
- On entry, if
LDVRβINTEGER, the leading dimension of the arrayVR.LDVR >= 1, and ifSIDE = 'R'or'B',LDVR >= N.MMβINTEGER, the number of columns in the arraysVLand/orVR.MM >= M. Same deal as before, the budget must cover it. πMβINTEGER, the number of columns in the arraysVLand/orVRactually used to store the eigenvectors. IfHOWMNY = 'A'or'B',Mis set toN. And note the complex version is simpler π: each selected eigenvector occupies one column. (No "two columns" drama here β that was the real-valuedstrevc3flex.)WORKβCOMPLEX*16array, dimension(MAX(1,LWORK)).LWORKβINTEGER, the dimension of arrayWORK. SoLWORK >= max(1,2*N). For optimum performance,LWORK >= N + 2*N*NB, whereNBis the optimal blocksize. π₯
And again, the classic: if LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the WORK array, returns this value as the first entry of the WORK array, and no error message related to LWORK is issued by XERBLA. π
RWORKβDOUBLE PRECISIONarray, dimension(LRWORK). Yes she brought her real-valued friend along, that's solidarity. πΈLRWORKβINTEGER, the dimension of arrayRWORK.LRWORK >= max(1,N).
Same query energy, second round: if LRWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of the RWORK array, returns this value as the first entry of the RWORK array, and no error message related to LRWORK is issued by XERBLA. π«Ά
INFOβINTEGER:= 0: successful exit β¨< 0: ifINFO = -i, the i-th argument had an illegal value π
π Author
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
π Further Details:
The algorithm used in this program is basically backward (forward) substitution, with scaling to make the the code robust against possible overflow.
(again with the "the the" β she's consistent, we respect it π)
Each eigenvector is normalized so that the element of largest magnitude has magnitude 1; here the magnitude of a complex number(x,y)is taken to be|x| + |y|.
So big-element-goes-to-1, and the complex magnitude is |x| + |y|, not the hypotenuse. Keep that in your notes, bestie. π
Definition at line 242 of file ztrevc3.f.
β Author
Generated automatically by Doxygen for LAPACK from the source code.
<a rainbow>and that's the whole page, bestie!!</a> π¦β¨ this lil masterpiece is stamped LAPACK, Version 3.12.0, and the page tag is trevc3(3) β go forth and compute your eigenvectors, u got this ππ
π¦ 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