Developer Reference for Intel® oneAPI Math Kernel Library for C

ID 766684
Date 3/22/2024
Public

A newer version of this document is available. Customers should click here to go to the newest version.

Document Table of Contents

?gges

Computes the generalized eigenvalues, Schur form, and the left and/or right Schur vectors for a pair of nonsymmetric matrices.

Syntax

lapack_int LAPACKE_sgges( int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_S_SELECT3 select, lapack_int n, float* a, lapack_int lda, float* b, lapack_int ldb, lapack_int* sdim, float* alphar, float* alphai, float* beta, float* vsl, lapack_int ldvsl, float* vsr, lapack_int ldvsr );

lapack_int LAPACKE_dgges( int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_D_SELECT3 select, lapack_int n, double* a, lapack_int lda, double* b, lapack_int ldb, lapack_int* sdim, double* alphar, double* alphai, double* beta, double* vsl, lapack_int ldvsl, double* vsr, lapack_int ldvsr );

lapack_int LAPACKE_cgges( int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_C_SELECT2 select, lapack_int n, lapack_complex_float* a, lapack_int lda, lapack_complex_float* b, lapack_int ldb, lapack_int* sdim, lapack_complex_float* alpha, lapack_complex_float* beta, lapack_complex_float* vsl, lapack_int ldvsl, lapack_complex_float* vsr, lapack_int ldvsr );

lapack_int LAPACKE_zgges( int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 select, lapack_int n, lapack_complex_double* a, lapack_int lda, lapack_complex_double* b, lapack_int ldb, lapack_int* sdim, lapack_complex_double* alpha, lapack_complex_double* beta, lapack_complex_double* vsl, lapack_int ldvsl, lapack_complex_double* vsr, lapack_int ldvsr );

Include Files

  • mkl.h

Description

The ?gges routine computes the generalized eigenvalues, the generalized real/complex Schur form (S,T), optionally, the left and/or right matrices of Schur vectors (vsl and vsr) for a pair of n-by-n real/complex nonsymmetric matrices (A,B). This gives the generalized Schur factorization

(A,B) = ( vsl*S *vsrH, vsl*T*vsrH )

Optionally, it also orders the eigenvalues so that a selected cluster of eigenvalues appears in the leading diagonal blocks of the upper quasi-triangular matrix S and the upper triangular matrix T. The leading columns of vsl and vsr then form an orthonormal/unitary basis for the corresponding left and right eigenspaces (deflating subspaces).

If only the generalized eigenvalues are needed, use the driver ggev instead, which is faster.

A generalized eigenvalue for a pair of matrices (A,B) is a scalar w or a ratio alpha / beta = w, such that A - w*B is singular. It is usually represented as the pair (alpha, beta), as there is a reasonable interpretation for beta=0 or for both being zero. A pair of matrices (S,T) is in the generalized real Schur form if T is upper triangular with non-negative diagonal and S is block upper triangular with 1-by-1 and 2-by-2 blocks. 1-by-1 blocks correspond to real generalized eigenvalues, while 2-by-2 blocks of S are "standardized" by making the corresponding elements of T have the form:


Equation

and the pair of corresponding 2-by-2 blocks in S and T will have a complex conjugate pair of generalized eigenvalues. A pair of matrices (S,T) is in generalized complex Schur form if S and T are upper triangular and, in addition, the diagonal of T are non-negative real numbers.

The ?gges routine replaces the deprecated ?gegs routine.

Input Parameters

matrix_layout

Specifies whether matrix storage layout is row major (LAPACK_ROW_MAJOR) or column major (LAPACK_COL_MAJOR).

jobvsl

Must be 'N' or 'V'.

If jobvsl = 'N', then the left Schur vectors are not computed.

If jobvsl = 'V', then the left Schur vectors are computed.

jobvsr

Must be 'N' or 'V'.

If jobvsr = 'N', then the right Schur vectors are not computed.

If jobvsr = 'V', then the right Schur vectors are computed.

sort

Must be 'N' or 'S'. Specifies whether or not to order the eigenvalues on the diagonal of the generalized Schur form.

If sort = 'N', then eigenvalues are not ordered.

If sort = 'S', eigenvalues are ordered (see select).

select

The select parameter is a pointer to a function returning a value of lapack_logical type. For different flavors the function has different arguments:

LAPACKE_sgges: lapack_logical (*LAPACK_S_SELECT3) ( const float*, const float*, const float* );

LAPACKE_dgges: lapack_logical (*LAPACK_D_SELECT3) ( const double*, const double*, const double* );

LAPACKE_cgges: lapack_logical (*LAPACK_C_SELECT2) ( const lapack_complex_float*, const lapack_complex_float* );

LAPACKE_zgges: lapack_logical (*LAPACK_Z_SELECT2) ( const lapack_complex_double*, const lapack_complex_double* );

If sort = 'S', select is used to select eigenvalues to sort to the top left of the Schur form.

If sort = 'N', select is not referenced.

For real flavors:

An eigenvalue (alphar[j] + alphai[j])/beta[j] is selected if select(alphar[j], alphai[j], beta[j]) is true; that is, if either one of a complex conjugate pair of eigenvalues is selected, then both complex eigenvalues are selected.

Note that in the ill-conditioned case, a selected complex eigenvalue may no longer satisfy select(alphar[j], alphai[j], beta[j]) = 1 after ordering. In this case info is set to n+2 .

For complex flavors:

An eigenvalue alpha[j] / beta[j] is selected if select(alpha[j], beta[j]) is true.

Note that a selected complex eigenvalue may no longer satisfy select(alpha[j], beta[j]) = 1 after ordering, since ordering may change the value of complex eigenvalues (especially if the eigenvalue is ill-conditioned); in this case info is set to n+2 (see info below).

n

The order of the matrices A, B, vsl, and vsr (n 0).

a, b

Arrays:

a (size at least max(1, lda*n)) is an array containing the n-by-n matrix A (first of the pair of matrices).

b (size at least max(1, ldb*n)) is an array containing the n-by-n matrix B (second of the pair of matrices).

lda

The leading dimension of the array a. Must be at least max(1, n).

ldb

The leading dimension of the array b. Must be at least max(1, n).

ldvsl, ldvsr

The leading dimensions of the output matrices vsl and vsr, respectively. Constraints:

ldvsl 1. If jobvsl = 'V', ldvsl max(1, n).

ldvsr 1. If jobvsr = 'V', ldvsr max(1, n).

Output Parameters

a

On exit, this array has been overwritten by its generalized Schur form S.

b

On exit, this array has been overwritten by its generalized Schur form T.

sdim

If sort = 'N', sdim= 0.

If sort = 'S', sdim is equal to the number of eigenvalues (after sorting) for which select is true.

Note that for real flavors complex conjugate pairs for which select is true for either eigenvalue count as 2.

alphar, alphai

Arrays, size at least max(1, n) each. Contain values that form generalized eigenvalues in real flavors.

See beta.

alpha

Array, size at least max(1, n). Contain values that form generalized eigenvalues in complex flavors. See beta.

beta

Array, size at least max(1, n).

For real flavors:

On exit, (alphar[j] + alphai[j]*i)/beta[j], j=0,..., n - 1, will be the generalized eigenvalues.

alphar[j] + alphai[j]*i and beta[j], j=0,..., n - 1 are the diagonals of the complex Schur form (S,T) that would result if the 2-by-2 diagonal blocks of the real generalized Schur form of (A,B) were further reduced to triangular form using complex unitary transformations. If alphai[j] is zero, then the j-th eigenvalue is real; if positive, then the j-th and (j+1)-st eigenvalues are a complex conjugate pair, with alphai[j+1] negative.

For complex flavors:

On exit, alpha[j]/beta[j], j=0,..., n - 1, will be the generalized eigenvalues. alpha[j] and beta[j], j=0,..., n - 1 are the diagonals of the complex Schur form (S,T) output by cgges/zgges. The beta[j] will be non-negative real.

See also Application Notes below.
vsl, vsr

Arrays:

vsl (size at least max(1, ldvsl*n)).

If jobvsl = 'V', this array will contain the left Schur vectors.

If jobvsl = 'N', vsl is not referenced.

vsr (size at least max(1, ldvsr*n)).

If jobvsr = 'V', this array will contain the right Schur vectors.

If jobvsr = 'N', vsr is not referenced.

Return Values

This function returns a value info.

If info=0, the execution is successful.

If info = -i, the i-th parameter had an illegal value.

If info = i, and

in:

the QZ iteration failed. (A, B) is not in Schur form, but alphar[j], alphai[j] (for real flavors), or alpha[j] (for complex flavors), and beta[j], j = info,..., n - 1 should be correct.

i > n: errors that usually indicate LAPACK problems:

i = n+1: other than QZ iteration failed in hgeqz;

i = n+2: after reordering, roundoff changed values of some complex eigenvalues so that leading eigenvalues in the generalized Schur form no longer satisfy select = 1. This could also be caused due to scaling;

i = n+3: reordering failed in tgsen.

Application Notes

The quotients alphar[j]/beta[j] and alphai[j]/beta[j] may easily over- or underflow, and beta[j] may even be zero. Thus, you should avoid simply computing the ratio. However, alphar and alphai will be always less than and usually comparable with norm(A) in magnitude, and beta always less than and usually comparable with norm(B).