stgexc - reorder the generalized real Schur decomposition of a real matrix pair (A,B) using an orthogonal equivalence transformation (A, B) = Q * (A, B) * Z',
SUBROUTINE STGEXC( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, LDZ, * IFST, ILST, WORK, LWORK, INFO) INTEGER N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL WANTQ, WANTZ REAL A(LDA,*), B(LDB,*), Q(LDQ,*), Z(LDZ,*), WORK(*)
SUBROUTINE STGEXC_64( WANTQ, WANTZ, N, A, LDA, B, LDB, Q, LDQ, Z, * LDZ, IFST, ILST, WORK, LWORK, INFO) INTEGER*8 N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL*8 WANTQ, WANTZ REAL A(LDA,*), B(LDB,*), Q(LDQ,*), Z(LDZ,*), WORK(*)
SUBROUTINE TGEXC( WANTQ, WANTZ, N, A, [LDA], B, [LDB], Q, [LDQ], Z, * [LDZ], IFST, ILST, [WORK], [LWORK], [INFO]) INTEGER :: N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL :: WANTQ, WANTZ REAL, DIMENSION(:) :: WORK REAL, DIMENSION(:,:) :: A, B, Q, Z
SUBROUTINE TGEXC_64( WANTQ, WANTZ, N, A, [LDA], B, [LDB], Q, [LDQ], * Z, [LDZ], IFST, ILST, [WORK], [LWORK], [INFO]) INTEGER(8) :: N, LDA, LDB, LDQ, LDZ, IFST, ILST, LWORK, INFO LOGICAL(8) :: WANTQ, WANTZ REAL, DIMENSION(:) :: WORK REAL, DIMENSION(:,:) :: A, B, Q, Z
#include <sunperf.h>
void stgexc(logical wantq, logical wantz, int n, float *a, int lda, float *b, int ldb, float *q, int ldq, float *z, int ldz, int *ifst, int *ilst, int *info);
void stgexc_64(logical wantq, logical wantz, long n, float *a, long lda, float *b, long ldb, float *q, long ldq, float *z, long ldz, long *ifst, long *ilst, long *info);
stgexc reorders the generalized real Schur decomposition of a real matrix pair (A,B) using an orthogonal equivalence transformation
so that the diagonal block of (A, B) with row index IFST is moved to row ILST.
(A, B) must be in generalized real Schur canonical form (as returned by SGGES), i.e. A is block upper triangular with 1-by-1 and 2-by-2 diagonal blocks. B is upper triangular.
Optionally, the matrices Q and Z of generalized Schur vectors are updated.
Q(in) * A(in) * Z(in)' = Q(out) * A(out) * Z(out)' Q(in) * B(in) * Z(in)' = Q(out) * B(out) * Z(out)'
.FALSE.: do not update Q.
.FALSE.: do not update Z.
WORK(1)
returns the optimal LWORK.
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.
=0: successful exit.
<0: if INFO = -i, the i-th argument had an illegal value.
=1: The transformed matrix pair (A, B) would be too far from generalized Schur form; the problem is ill- conditioned. (A, B) may have been partially reordered, and ILST points to the first row of the current position of the block being moved.
Based on contributions by
Bo Kagstrom and Peter Poromaa, Department of Computing Science, Umea University, S-901 87 Umea, Sweden.
[1] B. Kagstrom; A Direct Method for Reordering Eigenvalues in the Generalized Real Schur Form of a Regular Matrix Pair (A, B), in M.S. Moonen et al (eds), Linear Algebra for Large Scale and Real-Time Applications, Kluwer Academic Publ. 1993, pp 195-218.