public class EigenDecomposition extends Object
The eigen decomposition of matrix A is a set of two matrices: V and D such that A = V × D × VT. A, V and D are all m × m matrices.
This class is similar in spirit to the EigenvalueDecomposition
class from the JAMA
library, with the following changes:
getVt
method has been added,getRealEigenvalue
and
getImagEigenvalue
methods to pick up a
single eigenvalue have been added,getEigenvector
method to pick up a
single eigenvector has been added,getDeterminant
method has been added.getSolver
method has been added.As of 3.1, this class supports general real matrices (both symmetric and non-symmetric):
If A is symmetric, then A = V*D*V' where the eigenvalue matrix D is diagonal
and the eigenvector matrix V is orthogonal, i.e.
A = V.multiply(D.multiply(V.transpose()))
and
V.multiply(V.transpose())
equals the identity matrix.
If A is not symmetric, then the eigenvalue matrix D is block diagonal with the real eigenvalues in 1-by-1 blocks and any complex eigenvalues, lambda + i*mu, in 2-by-2 blocks:
[lambda, mu ] [ -mu, lambda]The columns of V represent the eigenvectors in the sense that
A*V = V*D
,
i.e. A.multiply(V) equals V.multiply(D).
The matrix V may be badly conditioned, or even singular, so the validity of the
equation A = V*D*inverse(V)
depends upon the condition of V.
This implementation is based on the paper by A. Drubrulle, R.S. Martin and J.H. Wilkinson "The Implicit QL Algorithm" in Wilksinson and Reinsch (1971) Handbook for automatic computation, vol. 2, Linear algebra, Springer-Verlag, New-York.
Constructor and Description |
---|
EigenDecomposition(double[] main,
double[] secondary)
Calculates the eigen decomposition of the symmetric tridiagonal
matrix.
|
EigenDecomposition(double[] main,
double[] secondary,
double epsilon)
Calculates the eigen decomposition of the symmetric tridiagonal
matrix.
|
EigenDecomposition(RealMatrix matrix)
Calculates the eigen decomposition of the given real matrix.
|
EigenDecomposition(RealMatrix matrix,
double epsilon)
Calculates the eigen decomposition of the given real matrix.
|
Modifier and Type | Method and Description |
---|---|
RealMatrix |
getD()
Gets the block diagonal matrix D of the decomposition.
|
double |
getDeterminant()
Computes the determinant of the matrix.
|
RealVector |
getEigenvector(int i)
Gets a copy of the ith eigenvector of the original matrix.
|
double |
getEpsilon()
Get's the value for epsilon which is used for internal tests (e.g.
|
double |
getImagEigenvalue(int i)
Gets the imaginary part of the ith eigenvalue of the original
matrix.
|
double[] |
getImagEigenvalues()
Gets a copy of the imaginary parts of the eigenvalues of the original
matrix.
|
double |
getRealEigenvalue(int i)
Returns the real part of the ith eigenvalue of the original
matrix.
|
double[] |
getRealEigenvalues()
Gets a copy of the real parts of the eigenvalues of the original matrix.
|
DecompositionSolver |
getSolver()
Gets a solver for finding the A × X = B solution in exact
linear sense.
|
RealMatrix |
getSquareRoot()
Computes the square-root of the matrix.
|
RealMatrix |
getV()
Gets the matrix V of the decomposition.
|
RealMatrix |
getVT()
Gets the transpose of the matrix V of the decomposition.
|
boolean |
hasComplexEigenvalues()
Returns whether the calculated eigen values are complex or real.
|
public EigenDecomposition(RealMatrix matrix)
Supports decomposition of a general matrix since 3.1.
matrix
- Matrix to decompose.MathIllegalStateException
- if the algorithm fails to converge.MathRuntimeException
- if the decomposition of a general matrix
results in a matrix with zero normpublic EigenDecomposition(RealMatrix matrix, double epsilon) throws MathRuntimeException
Supports decomposition of a general matrix since 3.1.
matrix
- Matrix to decompose.epsilon
- Epsilon used for internal tests (e.g. is singular, eigenvalue ratio, etc.)MathIllegalStateException
- if the algorithm fails to converge.MathRuntimeException
- if the decomposition of a general matrix
results in a matrix with zero normpublic EigenDecomposition(double[] main, double[] secondary)
main
- Main diagonal of the symmetric tridiagonal form.secondary
- Secondary of the tridiagonal form.MathIllegalStateException
- if the algorithm fails to converge.public EigenDecomposition(double[] main, double[] secondary, double epsilon)
main
- Main diagonal of the symmetric tridiagonal form.secondary
- Secondary of the tridiagonal form.epsilon
- Epsilon used for internal tests (e.g. is singular, eigenvalue ratio, etc.)MathIllegalStateException
- if the algorithm fails to converge.public RealMatrix getV()
public RealMatrix getD()
getRealEigenvalues()
,
getImagEigenvalues()
public double getEpsilon()
public RealMatrix getVT()
public boolean hasComplexEigenvalues()
The method performs a zero check for each element of the
getImagEigenvalues()
array and returns true
if any
element is not equal to zero.
true
if the eigen values are complex, false
otherwisepublic double[] getRealEigenvalues()
getD()
,
getRealEigenvalue(int)
,
getImagEigenvalues()
public double getRealEigenvalue(int i)
i
- index of the eigenvalue (counting from 0)getD()
,
getRealEigenvalues()
,
getImagEigenvalue(int)
public double[] getImagEigenvalues()
getD()
,
getImagEigenvalue(int)
,
getRealEigenvalues()
public double getImagEigenvalue(int i)
i
- Index of the eigenvalue (counting from 0).getD()
,
getImagEigenvalues()
,
getRealEigenvalue(int)
public RealVector getEigenvector(int i)
i
- Index of the eigenvector (counting from 0).getD()
public double getDeterminant()
public RealMatrix getSquareRoot()
MathRuntimeException
- if the matrix is not
symmetric or not positive definite.public DecompositionSolver getSolver()
Since 3.1, eigen decomposition of a general matrix is supported,
but the DecompositionSolver
only supports real eigenvalues.
MathRuntimeException
- if the decomposition resulted in
complex eigenvaluesCopyright © 2016-2021 CS GROUP. All rights reserved.