DTREVC(3)
π DTREVC(3) β bestie edition β¨
okay so this is from the Library Functions Manual, and the file we're talking about lives at /home/abui...RC/dtrevc.f(3). buckle up, we're doing linear algebra π
πΈ NAME πΈ
/home/abuild/rpmbuild/BUILD/lapack-static-3.12.0-build/lapack-3.12.0/SRC/dtrevc.f
like, that's the whole name. it's a path. it's giving "I was generated by a build system" and honestly? iconic π
β¨ SYNOPSIS β¨
Functions/Subroutines
subroutine DTREVC (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr,
mm, m, work, info)
DTREVC
π¦ Function/Subroutine Documentation π¦
subroutine DTREVC (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 info)
DTREVC β say it with me, bestie π£οΈ
π Purpose:
!>!> DTREVC 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**H)*T = w*(y**H)!>!> where y**H denotes the conjugate transpose of y.!> The eigenvalues are not input to this routine, but are read directly!> from the diagonal blocks of T.!>!> 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.!>
so real talk: you hand it a real upper quasi-triangular matrix T (the kind you get out of a Schur factorization of a real general matrix, A = Q*T*Q**T, courtesy of DHSEQR), and it hands you back eigenvectors. π₯ the eigenvalues? not an input, bestie β it reads them straight off the diagonal blocks of T. main character behavior.
the definitions, for the record: T*x = w*x and (y**H)*T = w*(y**H), where y**H is the conjugate transpose of y. and it can give you X and/or Y directly, or the products Q*X and/or Q*Y where Q is an input matrix. if Q is the orthogonal factor that reduces A to Schur form T, then Q*X and Q*Y are the eigenvectors of A. slay π
π Parameters π
π SIDE
!> SIDE is CHARACTER*1!> = 'R': compute right eigenvectors only;!> = 'L': compute left eigenvectors only;!> = 'B': compute both right and left eigenvectors.!>
'R'β right eigenvectors only, no notes π'L'β left eigenvectors only'B'β both. go off, get everything π
π 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 in VR and/or VL;!> = 'S': compute selected right and/or left eigenvectors,!> as indicated by the logical array SELECT.!>
'A'β all of them, the whole collection π'B'β all of them, but backtransformed by the matrices sitting inVRand/orVL'S'β only the ones you picked, as flagged by the logical arraySELECT
π SELECT
!> SELECT is LOGICAL array, dimension (N)!> If HOWMNY = 'S', SELECT specifies the eigenvectors to be!> computed.!> If w(j) is a real eigenvalue, the corresponding real!> eigenvector is computed if SELECT(j) is .TRUE..!> If w(j) and w(j+1) are the real and imaginary parts of a!> complex eigenvalue, the corresponding complex eigenvector is!> computed if either SELECT(j) or SELECT(j+1) is .TRUE., and!> on exit SELECT(j) is set to .TRUE. and SELECT(j+1) is set to!> .FALSE..!> Not referenced if HOWMNY = 'A' or 'B'.!>
okay the vibe check here: it's a LOGICAL array of dimension (N). when HOWMNY = 'S', SELECT is literally your shopping list of eigenvectors π
- if
w(j)is a real eigenvalue β that real eigenvector gets computed whenSELECT(j)is.TRUE. - if
w(j)andw(j+1)are the real and imaginary parts of a complex eigenvalue β that complex eigenvector gets computed if eitherSELECT(j)orSELECT(j+1)is.TRUE., and on exitSELECT(j)is set to.TRUE.andSELECT(j+1)is set to.FALSE.(it picks a winner, respectfully)
not referenced at all ifHOWMNY = 'A'or'B'β it's just vibing in the corner π
π N
!> N is INTEGER!> The order of the matrix T. N >= 0.!>
the order of matrix T, and it has to be N >= 0. that's it that's the tweet π
π T
!> T is DOUBLE PRECISION array, dimension (LDT,N)!> The upper quasi-triangular matrix T in Schur canonical form.!>
a DOUBLE PRECISION array, dimension (LDT,N), holding the upper quasi-triangular matrix T in Schur canonical form. gorgeous, no notes β¨
π LDT
!> LDT is INTEGER!> The leading dimension of the array T. LDT >= max(1,N).!>
INTEGER, the leading dimension of T, and it must satisfy LDT >= max(1,N).
π VL
!> VL is DOUBLE PRECISION array, dimension (LDVL,MM)!> On entry, if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must!> contain an N-by-N matrix Q (usually the orthogonal matrix Q!> of Schur vectors returned by DHSEQR).!> On exit, if SIDE = 'L' or 'B', VL contains:!> if HOWMNY = 'A', the matrix Y of left eigenvectors of T;!> if HOWMNY = 'B', the matrix Q*Y;!> if HOWMNY = 'S', the left eigenvectors of T specified by!> SELECT, stored consecutively in the columns!> of VL, in the same order as their!> eigenvalues.!> 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'.!>
DOUBLE PRECISION array, dimension (LDVL,MM). on entry: if SIDE = 'L' or 'B' and HOWMNY = 'B', VL must contain an N-by-N matrix Q (usually the orthogonal matrix Q of Schur vectors that DHSEQR returned π«Ά).
on exit, if SIDE = 'L' or 'B', VL contains:
HOWMNY = 'A'β the matrixYof left eigenvectors ofTHOWMNY = 'B'β the matrixQ*YHOWMNY = 'S'β the left eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVL, in the same order as their eigenvalues
a complex eigenvector for a complex eigenvalue takes two consecutive columns β first the real part, second the imaginary part. and it's not referenced at all if SIDE = 'R' π
π LDVL
!> LDVL is INTEGER!> The leading dimension of the array VL. LDVL >= 1, and if!> SIDE = 'L' or 'B', LDVL >= N.!>
leading dimension of VL: LDVL >= 1, and if SIDE = 'L' or 'B', then LDVL >= N.
π VR
!> VR is DOUBLE PRECISION array, dimension (LDVR,MM)!> On entry, if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must!> contain an N-by-N matrix Q (usually the orthogonal matrix Q!> of Schur vectors returned by DHSEQR).!> On exit, if SIDE = 'R' or 'B', VR contains:!> if HOWMNY = 'A', the matrix X of right eigenvectors of T;!> if HOWMNY = 'B', the matrix Q*X;!> if HOWMNY = 'S', the right eigenvectors of T specified by!> SELECT, stored consecutively in the columns!> of VR, in the same order as their!> eigenvalues.!> 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'.!>
DOUBLE PRECISION array, dimension (LDVR,MM). on entry: if SIDE = 'R' or 'B' and HOWMNY = 'B', VR must contain an N-by-N matrix Q (again, usually the orthogonal matrix Q of Schur vectors from DHSEQR).
on exit, if SIDE = 'R' or 'B', VR contains:
HOWMNY = 'A'β the matrixXof right eigenvectors ofTHOWMNY = 'B'β the matrixQ*XHOWMNY = 'S'β the right eigenvectors ofTspecified bySELECT, stored consecutively in the columns ofVR, in the same order as their eigenvalues
complex eigenvector, complex eigenvalue β two consecutive columns, real part then imaginary part. and not referenced if SIDE = 'L' π
π LDVR
!> LDVR is INTEGER!> The leading dimension of the array VR. LDVR >= 1, and if!> SIDE = 'R' or 'B', LDVR >= N.!>
leading dimension of VR: LDVR >= 1, and if SIDE = 'R' or 'B', then LDVR >= N.
π MM
!> MM is INTEGER!> The number of columns in the arrays VL and/or VR. MM >= M.!>
the number of columns in VL and/or VR, with MM >= M.
π M
!> M is INTEGER!> The number of columns in the arrays VL and/or VR actually!> used to store the eigenvectors.!> If HOWMNY = 'A' or 'B', M is set to N.!> Each selected real eigenvector occupies one column and each!> selected complex eigenvector occupies two columns.!>
the number of columns in VL and/or VR actually used to store the eigenvectors.
- if
HOWMNY = 'A'or'B',Mis set toN - each selected real eigenvector occupies one column, each selected complex eigenvector occupies two columns
π WORK
!> WORK is DOUBLE PRECISION array, dimension (3*N)!>
DOUBLE PRECISION array, dimension (3*N). that's the whole description, she's lowkey mysterious π
π INFO
!> INFO is INTEGER!> = 0: successful exit!> < 0: if INFO = -i, the i-th argument had an illegal value!>
= 0β successful exit, we ate π< 0β ifINFO = -i, the i-th argument had an illegal value. caught in 4k π
π Author π
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
the whole squad, credited, as they should be π
π₯ 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|.!>
so the algorithm is basically backward (forward) substitution, plus scaling so the code stays robust against possible overflow. (yes, the original really does say "the the" β I'm not fixing it, it's part of the lore π)
and every eigenvector is normalized so the element of largest magnitude has magnitude 1. for a complex number (x,y), the magnitude is taken to be |x| + |y|. periodt. π
Definition at line 220 of file dtrevc.f.
β Author (again, but make it meta) β
Generated automatically by Doxygen for LAPACK from the source code. beep boop, the robots wrote this one π€β¨
and that's the whole page, bestie!! π«Ά this was LAPACK, Version 3.12.0, hanging out at /home/abui...RC/dtrevc.f(3) β go forth and compute those eigenvectors, i'm obsessed with you ππΈπ¦
π¦ 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