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 CTREVC3
  • subroutine dtrevc3 (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, info) β€” the double-precision real one, aka DTREVC3
  • subroutine strevc3 (side, howmny, select, n, t, ldt, vl, ldvl, vr, ldvr, mm, m, work, lwork, info) β€” the single-precision real one, aka STREVC3
  • subroutine 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 in VR and/or VL;
    • = 'S': compute selected right and/or left eigenvectors, as indicated by the logical array SELECT.
  • SELECT β€” SELECT is LOGICAL array, dimension (N) If HOWMNY = 'S', SELECT specifies the eigenvectors to be computed. The eigenvector corresponding to the j-th eigenvalue is computed if SELECT(j) = .TRUE.. Not referenced if HOWMNY = 'A' or 'B'.
  • N β€” N is INTEGER The order of the matrix T. N >= 0.
  • T β€” T is COMPLEX array, dimension (LDT,N) The upper triangular matrix T. ⚠️ T is modified, but restored on exit. (so like, it goes through a phase and then comes back, don't worry πŸ’…)
  • LDT β€” LDT is INTEGER The leading dimension of the array T. LDT >= max(1,N).
  • VL β€” VL is COMPLEX 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 unitary matrix Q of Schur vectors returned by CHSEQR). 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.

Not referenced if SIDE = 'R'.

  • LDVL β€” LDVL is INTEGER The leading dimension of the array VL. LDVL >= 1, and if SIDE = 'L' or 'B', LDVL >= N.
  • VR β€” VR is COMPLEX 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 unitary matrix Q of Schur vectors returned by CHSEQR). 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.

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.
  • MM β€” MM is INTEGER The number of columns in the arrays VL and/or VR. 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 eigenvector occupies one column.
  • WORK β€” WORK is COMPLEX array, dimension (MAX(1,LWORK))
  • LWORK β€” LWORK is INTEGER The dimension of array WORK. LWORK >= max(1,2*N). For optimum performance, LWORK >= N + 2*N*NB, where NB is the optimal blocksize. πŸ’―
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. (the -1 hack, we love her πŸ™ˆ)
  • RWORK β€” RWORK is REAL array, dimension (LRWORK)
  • LRWORK β€” LRWORK is INTEGER The dimension of array RWORK. LRWORK >= max(1,N).
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 β€” INFO is INTEGER
    • = 0: successful exit ✨
    • < 0: if INFO = -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 in VR and/or VL;
    • = 'S': compute selected right and/or left eigenvectors, as indicated by the logical array SELECT.

πŸŽ€ SELECT

…and that's exactly where part 1 of this page dips out, so hold that thought β€” SELECT is literally mid-sentence πŸ’…

  • SELECT β€” a LOGICAL array, dimension (N). Bestie, this is your little checklist of which eigenvectors you actually want πŸŽ€ 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'. (So lowkey it tidies up after itself, iconic behavior tbh ✨)
  • N β€” INTEGER. The order of the matrix T. N >= 0. No cap, but also it can literally be zero, she's flexible πŸ’…
  • T β€” DOUBLE PRECISION array, dimension (LDT,N). The upper quasi-triangular matrix T in Schur canonical form. This is the main character of the whole situation, fr fr πŸ‘‘
  • LDT β€” INTEGER. The leading dimension of the array T. LDT >= max(1,N). Respect the leading dimension or the whole thing gets messy, ngl.
  • VL β€” DOUBLE PRECISION array, dimension (LDVL,MM). Okay so 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'. Two columns, one real one imag β€” she's splitting the vibe across two slots πŸ¦‹

  • LDVL β€” INTEGER. The leading dimension of the array VL. LDVL >= 1, and if SIDE = 'L' or 'B', LDVL >= N. Conditional requirements, we love a queen with rules πŸ’…
  • VR β€” 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'. Same energy as VL but right-side, obviously 🌸

  • LDVR β€” INTEGER. The leading dimension of the array VR. LDVR >= 1, and if SIDE = 'R' or 'B', LDVR >= N. Yes the pattern is the pattern, don't come for her 🫢
  • MM β€” INTEGER. The number of columns in the arrays VL and/or VR. MM >= M. It's the capacity, M is what actually gets used β€” think of it as the shelf versus what's on the shelf 😭
  • M β€” 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. So yeah, complex ones take double the closet space, that's just how it is πŸ’€
  • WORK β€” DOUBLE PRECISION array, dimension (MAX(1,LWORK)). The scratch space. Give her room to breathe ✨
  • LWORK β€” INTEGER. The dimension of array WORK. LWORK >= max(1,3*N). For optimum performance, LWORK >= N + 2*N*NB, where NB is 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: if INFO = -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 in VR and/or VL;
    • = 'S': compute selected right and/or left eigenvectors, as indicated by the logical array SELECT.

A, B, or S β€” all, backtransformed, or selected. Periodt ✨

  • SELECT β€” 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'. Also note she does her own cleanup on exit, which is honestly so considerate of her πŸŽ€
  • N β€” INTEGER. The order of the matrix T. N >= 0. Zero is allowed, she's not gonna judge.
  • T β€” REAL array, dimension (LDT,N). The upper quasi-triangular matrix T in Schur canonical form. The moment, the icon, the legend πŸ‘‘
  • LDT β€” INTEGER. The leading dimension of the array T. LDT >= max(1,N). Yes the same rule as before, because math is consistent like that πŸ’…
  • VL β€” REAL 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 SHSEQR). 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'. Two columns again, real then imag, we been knew πŸ¦‹

  • LDVL β€” INTEGER. The leading dimension of the array VL. LDVL >= 1, and if SIDE = 'L' or 'B', LDVL >= N. Conditional constraint, she's conditional about it πŸ’œ
  • VR β€” REAL 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 SHSEQR). 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'. Mirror image of VL, matching set, so cute 🌸

  • LDVR β€”
  • LDVR β€” INTEGER, the leading dimension of the array VR. Rules: LDVR >= 1, and if SIDE = 'R' or 'B', then LDVR >= N. ✨
  • MM β€” INTEGER, the number of columns in the arrays VL and/or VR. Bestie, MM >= M. That's the whole vibe. πŸ’…
  • M β€” INTEGER, the number of columns in VL and/or VR that are actually used to store the eigenvectors (the real ones, not the wishful ones). If HOWMNY = 'A' or 'B', then M is set to N. 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 array WORK. So LWORK >= max(1,3*N). For optimum performance tho (highkey worth it), LWORK >= N + 2*N*NB, where NB is 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: if INFO = -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:

ZTREVC3 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 ZHSEQR.

So like, ZHSEQR hands you T, and this routine does the eigenvector thing. Chain of command, iykyk. πŸ’…

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.

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 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.

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 in VR and/or VL;
    • = 'S': compute selected right and/or left eigenvectors, as indicated by the logical array SELECT.
  • SELECT β€” LOGICAL array, dimension (N). If HOWMNY = 'S', SELECT specifies the eigenvectors to be computed. The eigenvector corresponding to the j-th eigenvalue is computed if SELECT(j) = .TRUE.. Not referenced if HOWMNY = 'A' or 'B'. πŸ™ˆ
  • N β€” INTEGER, the order of the matrix T. N >= 0.
  • T β€” COMPLEX*16 array, dimension (LDT,N). The upper triangular matrix T. Heads up ⚠️: T is 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 array T. LDT >= max(1,N).
  • VL β€” COMPLEX*16 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 unitary matrix Q of Schur vectors returned by ZHSEQR).
    • 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.
    • Not referenced if SIDE = 'R'. πŸ’€
  • LDVL β€” INTEGER, the leading dimension of the array VL. LDVL >= 1, and if SIDE = 'L' or 'B', LDVL >= N.
  • VR β€” COMPLEX*16 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 unitary matrix Q of Schur vectors returned by ZHSEQR).
    • 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.
    • Not referenced if SIDE = 'L'. πŸ’€
  • LDVR β€” INTEGER, the leading dimension of the array VR. LDVR >= 1, and if SIDE = 'R' or 'B', LDVR >= N.
  • MM β€” INTEGER, the number of columns in the arrays VL and/or VR. MM >= M. Same deal as before, the budget must cover it. πŸ’…
  • M β€” 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. And note the complex version is simpler πŸ‘€: each selected eigenvector occupies one column. (No "two columns" drama here β€” that was the real-valued strevc3 flex.)
  • WORK β€” COMPLEX*16 array, dimension (MAX(1,LWORK)).
  • LWORK β€” INTEGER, the dimension of array WORK. So LWORK >= max(1,2*N). For optimum performance, LWORK >= N + 2*N*NB, where NB is 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 PRECISION array, dimension (LRWORK). Yes she brought her real-valued friend along, that's solidarity. 🌸
  • LRWORK β€” INTEGER, the dimension of array RWORK. 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: if INFO = -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