org.apache.commons.math.linear
public class EigenDecompositionImpl extends Object implements EigenDecomposition
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.
As of 2.0, this class supports only symmetric matrices, and
hence computes only real realEigenvalues. This implies the D matrix returned
by getD()
is always diagonal and the imaginary values returned
getImagEigenvalue(int)
and getImagEigenvalues()
are always
null.
When called with a RealMatrix
argument, this implementation only uses
the upper part of the matrix, the part below the diagonal is not accessed at
all.
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
Modifier and Type | Class and Description |
---|---|
private static class |
EigenDecompositionImpl.Solver
Specialized solver.
|
Modifier and Type | Field and Description |
---|---|
private RealMatrix |
cachedD
Cached value of D.
|
private RealMatrix |
cachedV
Cached value of V.
|
private RealMatrix |
cachedVt
Cached value of Vt.
|
private ArrayRealVector[] |
eigenvectors
Eigenvectors.
|
private double[] |
imagEigenvalues
Imaginary part of the realEigenvalues.
|
private double[] |
main
Main diagonal of the tridiagonal matrix.
|
private byte |
maxIter
Maximum number of iterations accepted in the implicit QL transformation
|
private double[] |
realEigenvalues
Real part of the realEigenvalues.
|
private double[] |
secondary
Secondary diagonal of the tridiagonal matrix.
|
private TriDiagonalTransformer |
transformer
Transformer to tridiagonal (may be null if matrix is already
tridiagonal).
|
Constructor and Description |
---|
EigenDecompositionImpl(double[] main,
double[] secondary,
double splitTolerance)
Calculates the eigen decomposition of the symmetric tridiagonal
matrix.
|
EigenDecompositionImpl(RealMatrix matrix,
double splitTolerance)
Calculates the eigen decomposition of the given symmetric matrix.
|
Modifier and Type | Method and Description |
---|---|
private void |
findEigenVectors(double[][] householderMatrix)
Find eigenvalues and eigenvectors (Dubrulle et al., 1971)
|
RealMatrix |
getD()
Returns the block diagonal matrix D of the decomposition.
|
double |
getDeterminant()
Return the determinant of the matrix
|
RealVector |
getEigenvector(int i)
Returns a copy of the ith eigenvector of the original matrix.
|
double |
getImagEigenvalue(int i)
Returns the imaginary part of the ith eigenvalue of the original matrix.
|
double[] |
getImagEigenvalues()
Returns 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()
Returns a copy of the real parts of the eigenvalues of the original matrix.
|
DecompositionSolver |
getSolver()
Get a solver for finding the A × X = B solution in exact linear sense.
|
RealMatrix |
getV()
Returns the matrix V of the decomposition.
|
RealMatrix |
getVT()
Returns the transpose of the matrix V of the decomposition.
|
private boolean |
isSymmetric(RealMatrix matrix)
Check if a matrix is symmetric.
|
private void |
transformToTridiagonal(RealMatrix matrix)
Transform matrix to tridiagonal.
|
private byte maxIter
private double[] main
private double[] secondary
private TriDiagonalTransformer transformer
private double[] realEigenvalues
private double[] imagEigenvalues
private ArrayRealVector[] eigenvectors
private RealMatrix cachedV
private RealMatrix cachedD
private RealMatrix cachedVt
public EigenDecompositionImpl(RealMatrix matrix, double splitTolerance) throws InvalidMatrixException
matrix
- The symmetric matrix to decompose.splitTolerance
- dummy parameter, present for backward compatibility only.InvalidMatrixException
- (wrapping a
ConvergenceException
if algorithm
fails to convergepublic EigenDecompositionImpl(double[] main, double[] secondary, double splitTolerance) throws InvalidMatrixException
main
- Main diagonal of the symmetric triadiagonal formsecondary
- Secondary of the tridiagonal formsplitTolerance
- dummy parameter, present for backward compatibility only.InvalidMatrixException
- (wrapping a
ConvergenceException
if algorithm
fails to convergeprivate boolean isSymmetric(RealMatrix matrix)
matrix
- matrix to checkpublic RealMatrix getV() throws InvalidMatrixException
V is an orthogonal matrix, i.e. its transpose is also its inverse.
The columns of V are the eigenvectors of the original matrix.
No assumption is made about the orientation of the system axes formed by the columns of V (e.g. in a 3-dimension space, V can form a left- or right-handed system).
getV
in interface EigenDecomposition
InvalidMatrixException
public RealMatrix getD() throws InvalidMatrixException
D is a block diagonal matrix.
Real eigenvalues are on the diagonal while complex values are on 2x2 blocks { {real +imaginary}, {-imaginary, real} }.
getD
in interface EigenDecomposition
InvalidMatrixException
EigenDecomposition.getRealEigenvalues()
,
EigenDecomposition.getImagEigenvalues()
public RealMatrix getVT() throws InvalidMatrixException
V is an orthogonal matrix, i.e. its transpose is also its inverse.
The columns of V are the eigenvectors of the original matrix.
No assumption is made about the orientation of the system axes formed by the columns of V (e.g. in a 3-dimension space, V can form a left- or right-handed system).
getVT
in interface EigenDecomposition
InvalidMatrixException
public double[] getRealEigenvalues() throws InvalidMatrixException
getRealEigenvalues
in interface EigenDecomposition
InvalidMatrixException
EigenDecomposition.getD()
,
EigenDecomposition.getRealEigenvalue(int)
,
EigenDecomposition.getImagEigenvalues()
public double getRealEigenvalue(int i) throws InvalidMatrixException, ArrayIndexOutOfBoundsException
getRealEigenvalue
in interface EigenDecomposition
i
- index of the eigenvalue (counting from 0)InvalidMatrixException
ArrayIndexOutOfBoundsException
EigenDecomposition.getD()
,
EigenDecomposition.getRealEigenvalues()
,
EigenDecomposition.getImagEigenvalue(int)
public double[] getImagEigenvalues() throws InvalidMatrixException
getImagEigenvalues
in interface EigenDecomposition
InvalidMatrixException
EigenDecomposition.getD()
,
EigenDecomposition.getImagEigenvalue(int)
,
EigenDecomposition.getRealEigenvalues()
public double getImagEigenvalue(int i) throws InvalidMatrixException, ArrayIndexOutOfBoundsException
getImagEigenvalue
in interface EigenDecomposition
i
- index of the eigenvalue (counting from 0)InvalidMatrixException
ArrayIndexOutOfBoundsException
EigenDecomposition.getD()
,
EigenDecomposition.getImagEigenvalues()
,
EigenDecomposition.getRealEigenvalue(int)
public RealVector getEigenvector(int i) throws InvalidMatrixException, ArrayIndexOutOfBoundsException
getEigenvector
in interface EigenDecomposition
i
- index of the eigenvector (counting from 0)InvalidMatrixException
ArrayIndexOutOfBoundsException
EigenDecomposition.getD()
public double getDeterminant()
getDeterminant
in interface EigenDecomposition
public DecompositionSolver getSolver()
getSolver
in interface EigenDecomposition
private void transformToTridiagonal(RealMatrix matrix)
matrix
- matrix to transformprivate void findEigenVectors(double[][] householderMatrix)
householderMatrix
- Householder matrix of the transformation
to tri-diagonal form.Copyright (c) 2003-2013 Apache Software Foundation