ManagedLapack.SymmetricGeneralizedEigenvalueDecompose Method

Definition

Namespace: Numerics.NET.LinearAlgebra.Implementation
Assembly: Numerics.NET (in Numerics.NET.dll) Version: 9.0.4

Overload List

SymmetricGeneralizedEigenvalueDecompose(Int32, Char, MatrixTriangle, Int32, Array2D<TReal>, Array2D<TReal>, Array1D<TReal>, Int32)

Computes all the eigenvalues, and optionally, the eigenvectors of a real generalized symmetric-definite eigenproblem, of the form A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.

SymmetricGeneralizedEigenvalueDecompose(Int32, Char, MatrixTriangle, Int32, Span2D<TReal>, Span2D<TReal>, Span<TReal>, Int32)

Computes all the eigenvalues, and optionally, the eigenvectors of a real generalized symmetric-definite eigenproblem, of the form A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.

SymmetricGeneralizedEigenvalueDecompose(Int32, Char, MatrixTriangle, Int32, Span<Double>, Int32, Span<Double>, Int32, Span<Double>, Int32)

Computes all the eigenvalues, and optionally, the eigenvectors of a real generalized symmetric-definite eigenproblem, of the form A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.

SymmetricGeneralizedEigenvalueDecompose(Int32, Char, MatrixTriangle, Int32, Span<Double>, Int32, Span<Double>, Int32, Span<Double>, Int32)

Computes all the eigenvalues, and optionally, the eigenvectors of a real generalized symmetric-definite eigenproblem, of the form A*x=(lambda)*B*x, A*Bx=(lambda)*x, or B*A*x=(lambda)*x.

C#
public override void SymmetricGeneralizedEigenvalueDecompose(
	int itype,
	char jobz,
	MatrixTriangle uplo,
	int n,
	Span<double> a,
	int lda,
	Span<double> b,
	int ldb,
	Span<double> w,
	out int info
)

Parameters

itype  Int32
C#
ITYPE is INTEGER
Specifies the problem type to be solved:
= 1:  A*x = (lambda)*B*x
= 2:  A*B*x = (lambda)*x
= 3:  B*A*x = (lambda)*x
jobz  Char
C#
JOBZ is CHARACTER*1
= 'N':  Compute eigenvalues only;
= 'V':  Compute eigenvalues and eigenvectors.
uplo  MatrixTriangle
C#
UPLO is CHARACTER*1
= 'U':  Upper triangles of A and B are stored;
= 'L':  Lower triangles of A and B are stored.
n  Int32
C#
N is INTEGER
The order of the matrices A and B.  N >= 0.
a  Span<Double>
C#
A is DOUBLE PRECISION array, dimension (LDA, N)
On entry, the symmetric matrix A.  If UPLO = 'U', the
leading N-by-N upper triangular part of A contains the
upper triangular part of the matrix A.  If UPLO = 'L',
the leading N-by-N lower triangular part of A contains
the lower triangular part of the matrix A.
On exit, if JOBZ = 'V', then if INFO = 0, A contains the
matrix Z of eigenvectors.  The eigenvectors are normalized
as follows:
if ITYPE = 1 or 2, Z**T*B*Z = I;
if ITYPE = 3, Z**T*inv(B)*Z = I.
If JOBZ = 'N', then on exit the upper triangle (if UPLO='U')
or the lower triangle (if UPLO='L') of A, including the
diagonal, is destroyed.
lda  Int32
C#
LDA is INTEGER
The leading dimension of the array A.  LDA >= max(1,N).
b  Span<Double>
C#
B is DOUBLE PRECISION array, dimension (LDB, N)
On entry, the symmetric matrix B.  If UPLO = 'U', the
leading N-by-N upper triangular part of B contains the
upper triangular part of the matrix B.  If UPLO = 'L',
the leading N-by-N lower triangular part of B contains
the lower triangular part of the matrix B.
On exit, if INFO <= N, the part of B containing the matrix is
overwritten by the triangular factor U or L from the Cholesky
factorization B = U**T*U or B = L*L**T.
ldb  Int32
C#
LDB is INTEGER
The leading dimension of the array B.  LDB >= max(1,N).
w  Span<Double>
C#
W is DOUBLE PRECISION array, dimension (N)
If INFO = 0, the eigenvalues in ascending order.
info  Int32
C#
INFO is INTEGER
= 0:  successful exit
< 0:  if INFO = -i, the i-th argument had an illegal value
> 0:  DPOTRF or DSYEVD returned an error code:
   <= N:  if INFO = i and JOBZ = 'N', then the algorithm
          failed to converge; i off-diagonal elements of an
          intermediate tridiagonal form did not converge to
          zero;
          if INFO = i and JOBZ = 'V', then the algorithm
          failed to compute an eigenvalue while working on
          the submatrix lying in rows and columns INFO/(N+1)
          through mod(INFO,N+1);
   > N:   if INFO = N + i, for 1 <= i <= N, then the leading
          minor of order i of B is not positive definite.
          The factorization of B could not be completed and
          no eigenvalues or eigenvectors were computed.

Remarks

C#
Here A and
B are assumed to be symmetric and B is also positive definite.
If eigenvectors are desired, it uses a divide and conquer algorithm.
The divide and conquer algorithm makes very mild assumptions about
floating point arithmetic. It will work on machines with a guard
digit in add/subtract, or on those binary machines without guard
digits which subtract like the Cray X-MP, Cray Y-MP, Cray C-90, or
Cray-2. It could conceivably fail on hexadecimal or decimal machines
without guard digits, but we know of none.

Further Details:

C#
Modified so that no backsubstitution is performed if DSYEVD fails to
converge (NEIG in old code could be greater than N causing out of
bounds reference to A - reported by Ralf Meyer).  Also corrected the
description of INFO and the test on ITYPE. Sven, 16 Feb 05.

Contributors:

Mark Fahey, Department of Mathematics, Univ. of Kentucky, USA

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

Date: November 2015

See Also