trexc(3)

πŸŽ€ trexc(3) β€” reorder Schur form πŸŽ€

okay so this is trexc(3), from the Library Functions Manual, and bestie… it's giving "four subroutines, one very specific job" energy ✨ This whole page is about taking a Schur form and moving one thing somewhere else in it, and honestly? iconic behaviour. Let's get into it πŸ’…


✨ NAME ✨

trexc β€” trexc: reorder Schur form


🌈 SYNOPSIS 🌈

Functions 🫢

  • subroutine ctrexc (compq, n, t, ldt, q, ldq, ifst, ilst, info) β€” CTREXC
  • subroutine dtrexc (compq, n, t, ldt, q, ldq, ifst, ilst, work, info) β€” DTREXC
  • subroutine strexc (compq, n, t, ldt, q, ldq, ifst, ilst, work, info) β€” STREXC
  • subroutine ztrexc (compq, n, t, ldt, q, ldq, ifst, ilst, info) β€” ZTREXC

πŸ’« Detailed Description πŸ’«

No extra lore here β€” the page goes straight into documenting the functions themselves, so that's exactly what we're doing too πŸŽ€


πŸ‘‘ Function Documentation πŸ‘‘

πŸ’œ ctrexc β€” CTREXC

subroutine ctrexc (character compq, integer n, complex, dimension( ldt, * ) t,
     integer ldt, complex, dimension( ldq, * ) q, integer ldq, integer
     ifst, integer ilst, integer info)

Purpose:

CTREXC reorders the Schur factorization of a complex matrix A = Q*T*Q**H, so that the diagonal element of T with row index IFST is moved to row ILST πŸ’«

The Schur form T gets reordered by a unitary similarity transformation Z**H*T*Z, and optionally the matrix Q of Schur vectors is updated by postmultiplying it with Z. Slay ✨

Parameters:

  • COMPQ β€” COMPQ is CHARACTER*1
    • = 'V': update the matrix Q of Schur vectors;
    • = 'N': do not update Q.
  • N β€” N is INTEGER, the order of the matrix T. N >= 0.
    • If N == 0 arguments ILST and IFST may be any value. (no thoughts, head empty, it literally does not matter πŸ™ˆ)
  • T β€” T is COMPLEX array, dimension (LDT,N)
    • On entry, the upper triangular matrix T.
    • On exit, the reordered upper triangular matrix.
  • LDT β€” LDT is INTEGER, the leading dimension of the array T. LDT >= max(1,N).
  • Q β€” Q is COMPLEX array, dimension (LDQ,N)
    • On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
    • On exit, if COMPQ = 'V', Q has been postmultiplied by the unitary transformation matrix Z which reorders T.
    • If COMPQ = 'N', Q is not referenced. (she's not coming to the party 🫢)
  • LDQ β€” LDQ is INTEGER, the leading dimension of the array Q. LDQ >= 1, and if COMPQ = 'V', LDQ >= max(1,N).
  • IFST β€” IFST is INTEGER
  • ILST β€” ILST is INTEGER
    • These two specify the reordering of the diagonal elements of T: the element with row index IFST is moved to row ILST by a sequence of transpositions between adjacent elements πŸ”
    • 1 <= IFST <= N; 1 <= ILST <= N.
  • 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.

Definition at line 125 of file ctrexc.f.


πŸ¦‹ dtrexc β€” DTREXC

subroutine dtrexc (character compq, integer n, double precision, dimension(
     ldt, * ) t, integer ldt, double precision, dimension( ldq, * ) q,
     integer ldq, integer ifst, integer ilst, double precision, dimension( *
     ) work, integer info)

Purpose:

DTREXC reorders the real Schur factorization of a real matrix A = Q*T*Q**T, so that the diagonal block of T with row index IFST is moved to row ILST πŸ’«

The real Schur form T is reordered by an orthogonal similarity transformation Z**T*T*Z, and optionally the matrix Q of Schur vectors is updated by postmultiplying it with Z.

Heads up bestie πŸ“’ T must be in Schur canonical form (as returned by DHSEQR), that is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block has its diagonal elements equal and its off-diagonal elements of opposite sign. No substitutions, no "close enough" β€” the vibe check is strict.

Parameters:

  • COMPQ β€” COMPQ is CHARACTER*1
    • = 'V': update the matrix Q of Schur vectors;
    • = 'N': do not update Q.
  • N β€” N is INTEGER, the order of the matrix T. N >= 0.
    • If N == 0 arguments ILST and IFST may be any value.
  • T β€” T is DOUBLE PRECISION array, dimension (LDT,N)
    • On entry, the upper quasi-triangular matrix T, in Schur Schur canonical form. (yes, it says Schur twice β€” the source really did that, and honestly? she ate 😭)
    • On exit, the reordered upper quasi-triangular matrix, again in Schur canonical form.
  • LDT β€” LDT is INTEGER, the leading dimension of the array T. LDT >= max(1,N).
  • Q β€” Q is DOUBLE PRECISION array, dimension (LDQ,N)
    • On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
    • On exit, if COMPQ = 'V', Q has been postmultiplied by the orthogonal transformation matrix Z which reorders T.
    • If COMPQ = 'N', Q is not referenced.
  • LDQ β€” LDQ is INTEGER, the leading dimension of the array Q. LDQ >= 1, and if COMPQ = 'V', LDQ >= max(1,N).
  • IFST β€” IFST is INTEGER
  • ILST β€” ILST is INTEGER
    • These specify the reordering of the diagonal blocks of T. The block with row index IFST is moved to row ILST, by a sequence of transpositions between adjacent blocks πŸ”
    • On exit, if IFST pointed on entry to the second row of a 2-by-2 block, it is changed to point to the first row; ILST always points to the first row of the block in its final position (which may differ from its input value by +1 or -1). Track that glow-up carefully πŸ’…
    • 1 <= IFST <= N; 1 <= ILST <= N.
  • WORK β€” WORK is DOUBLE PRECISION array, dimension (N)
  • INFO β€” INFO is INTEGER
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value 😭
    • = 1: two adjacent blocks were too close to swap (the problem is very ill-conditioned); T may have been partially reordered, and ILST points to the first row of the current position of the block being moved. Not a full slay, more of a partial slay πŸ’€

Author: Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver, NAG Ltd.

Definition at line 146 of file dtrexc.f.


🌸 strexc β€” STREXC

subroutine strexc (character compq, integer n, real, dimension( ldt, * ) t,
     integer ldt, real, dimension( ldq, * ) q, integer ldq, integer ifst,
     integer ilst, real, dimension( * ) work, integer info)

Purpose:

STREXC reorders the real Schur factorization of a real matrix A = Q*T*Q**T, so that the diagonal block of T with row index IFST is moved to row ILST πŸ’«

The real Schur form T is reordered by an orthogonal similarity transformation Z**T*T*Z, and optionally the matrix Q of Schur vectors is updated by postmultiplying it with Z.

Same deal as above, bestie πŸ“’ T must be in Schur canonical form (as returned by SHSEQR), that is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block has its diagonal elements equal and its off-diagonal elements of opposite sign.

Parameters:

  • COMPQ β€” COMPQ is CHARACTER*1
    • = 'V': update the matrix Q of Schur vectors;
    • = 'N': do not update Q.
  • N β€” N is INTEGER, the order of the matrix T. N >= 0.
    • If N == 0 arguments ILST and IFST may be any value.
  • T β€” T is REAL array, dimension (LDT,N)
    • On entry, the upper quasi-triangular matrix T, in Schur Schur canonical form. (double Schur again β€” consistency is key ✨)
    • On exit, the reordered upper quasi-triangular matrix, again in Schur canonical form.
  • LDT β€” LDT is INTEGER, the leading dimension of the array T. LDT >= max(1,N).
  • Q β€” Q is REAL array, dimension (LDQ,N)
    • On entry, if COMPQ = 'V', the matrix Q of Schur vectors.
    • On exit, if COMPQ = 'V', Q has been postmultiplied by the orthogonal transformation matrix Z which reorders T.
    • If COMPQ = 'N', Q is not referenced.
  • LDQ β€” LDQ is INTEGER, the leading dimension of the array Q. LDQ >= 1, and if COMPQ = 'V', LDQ >= max(1,N).
  • IFST β€” IFST is INTEGER
  • ILST β€” ILST is INTEGER
    • These specify the reordering of the diagonal blocks of T. The block with row index IFST is moved to row ILST, by a sequence of transpositions between adjacent blocks πŸ”
    • On exit, if IFST pointed on entry to the second row of a 2-by-2 block, it is changed to point to the first row; ILST always points to the first row of the block in its final position (which may differ from its input value by +1 or -1).
    • 1 <= IFST <= N; 1 <= ILST <= N.
  • WORK β€” WORK is REAL array, dimension (N)
  • INFO β€” INFO is INTEGER
    • = 0: successful exit πŸŽ‰
    • < 0: if INFO = -i, the i-th argument had an illegal value 😭
    • = 1: two adjacent blocks were too close to swap (the problem is very ill-conditioned); T may have been partially reordered, and ILST points to the first row of the current position of the block being moved.

Author: Univ. of Tennessee, Univ. of California Berkeley, Univ. of Colorado Denver, NAG Ltd.

Definition at line 146 of file strexc.f.


🧚 ztrexc β€” ZTREXC

subroutine ztrexc (character compq, integer n, complex*16, dimension( ldt, *
     ) t, integer ldt, complex*16, dimension( ldq, * ) q, integer ldq,
     integer ifst, integer ilst, integer info)

Purpose:

…and that's exactly where this half of the page runs out 🫠 the rest of ZTREXC's purpose, parameters, author line and file definition are all waiting for you in part 2 πŸ’–

…okay so picking right back up, bestie πŸ’…

ZTREXC reorders the Schur factorization of a complex matrix A = Q*T*Q**H, so that the diagonal element of T with row index IFST is moved to row ILST. Fr fr, that's the whole plot.

The Schur form T gets reordered by a unitary similarity transformation Z**H*T*Z, and optionally the matrix Q of Schur vectors is updated by postmultiplying it with Z. Lowkey elegant, ngl πŸ¦‹


✨ Parameters ✨

COMPQ

COMPQ is CHARACTER*1

  • = 'V': update the matrix Q of Schur vectors;
  • = 'N': do not update Q.

Like, do you want the vectors or not, pick a lane bestie πŸŽ€

N

N is INTEGER

The order of the matrix T. N >= 0.

And here's the little get-out-of-jail card: if N == 0, arguments ILST and IFST may be any value. Zero-sized matrix, zero problems, we love a chill edge case πŸ’–

T

T is COMPLEX*16 array, dimension (LDT,N)

On entry, the upper triangular matrix T.

On exit, the reordered upper triangular matrix. She gets a glow-up in place, iconic πŸ’…

LDT

LDT is INTEGER

The leading dimension of the array T. LDT >= max(1,N). Respect the leading dimension or perish, that's the rule πŸ™ˆ

Q

Q is COMPLEX*16 array, dimension (LDQ,N)

On entry, if COMPQ = 'V', the matrix Q of Schur vectors.

On exit, if COMPQ = 'V', Q has been postmultiplied by the unitary transformation matrix Z which reorders T.

If COMPQ = 'N', Q is not referenced. She's simply not invited to the function, no hard feelings 🫢

LDQ

LDQ is INTEGER

The leading dimension of the array Q. LDQ >= 1, and if COMPQ = 'V', LDQ >= max(1,N). Read the condition, bestie β€” it's conditional for a reason ✨

IFST

IFST is INTEGER

ILST

ILST is INTEGER

These two specify the reordering of the diagonal elements of T: the element with row index IFST is moved to row ILST by a sequence of transpositions between adjacent elements.

1 <= IFST <= N; 1 <= ILST <= N.

Heads up: those bounds are not a suggestion. Step outside 1 to N and INFO will come for you πŸ’€

INFO

INFO is INTEGER

  • = 0: successful exit πŸŽ‰ slay, we ate
  • < 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.

Definition at line 125 of file ztrexc.f.


πŸŽ€ Author

Generated automatically by Doxygen for LAPACK from the source code.


And that's the whole page, bestie 🫢 this little beauty is from LAPACK Version 3.12.0 β€” the trexc(3) page β€” and no, I did not make any of it up, every flag is right where the source code left it. Go reorder some Schur forms, you absolute main character πŸŒˆβ­πŸ’œ

πŸ“¦ where this page comes from