XLPack 7.0
XLPack Numerical Library (C API) Reference Manual
Loading...
Searching...
No Matches

◆ dtrexc()

void dtrexc ( char  compq,
int  n,
int  ldt,
double  t[],
int  ldq,
double  q[],
int *  ifst,
int *  ilst,
double  work[],
int *  info 
)

Reordering of real Schur factorization of real matrix

Purpose
This routine 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.

T must be in Schur canonical form (as returned by dhseqr), that is, block upper triangular with 1 x 1 and 2 x 2 diagonal blocks; each 2 x 2 diagonal block has its diagonal elements equal and its off-diagonal elements of opposite sign.
Parameters
[in]compq= 'V': Update the matrix Q of Schur vectors.
= 'N': Do not update Q.
[in]nOrder of the matrix T. (n >= 0) (If n = 0, returns without computation)
[in]ldtLeading dimension of the two dimensional array t[][]. (ldt >= max(1, n))
[in,out]t[][]Array t[lt][ldt] (lt >= n)
[in] The upper quasi-triangular matrix T, in Schur canonical form.
[out] The reordered upper quasi-triangular matrix, again in Schur canonical form.
[in]ldqLeading dimension of the two dimensional array q[][]. (ldq >= 1 if compq = 'N', ldq >= max(1, n) if compq = 'V')
[in,out]q[][]Array q[lq][ldq] (lq >= n)
If compq = 'V',
[in] The matrix Q of Schur vectors.
[out] Q has been postmultiplied by the orthogonal transformation matrix Z which reorders T.
If compq = 'N', q[][] is not referenced.
[in,out]ifst
[in,out]ilst[in] 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.
[out] If ifst pointed on entry to the second row of a 2 x 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)
[out]work[]Array work[lwork] (lwork >= n)
Work array.
[out]info= 0: Successful exit
= -1: The argument compq had an illegal value (copq != 'V' nor 'N')
= -2: The argument n had an illegal value (n < 0)
= -3: The argument ldt had an illegal value (ldt < max(1, n))
= -5: The argument ldq had an illegal value (ldq too small)
= -7: The argument ifst had an illegal value (ifst < 1 or ifst > n)
= -8: The argument ilst had an illegal value (ilst < 1 or ilst > n)
= 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.
Reference
LAPACK