Class EigenDecomposition

java.lang.Object
edu.pitt.csb.mgm.EigenDecomposition

public class EigenDecomposition extends Object
Calculates the eigen decomposition of a real matrix.

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.> 0

This class is similar in spirit to the EigenvalueDecomposition class from the JAMA library, with the following changes:> 0

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

Since:
2.0 (changed to concrete class in 3.0)
See Also:
  • Constructor Summary

    Constructors
    Constructor
    Description
    EigenDecomposition(double[] main, double[] secondary)
    Calculates the eigen decomposition of the symmetric tridiagonal matrix.
    EigenDecomposition(double[] main, double[] secondary, double splitTolerance)
    Deprecated.
    in 3.1 (to be removed in 4.0) due to unused parameter
    EigenDecomposition(org.apache.commons.math3.linear.RealMatrix matrix)
    Calculates the eigen decomposition of the given real matrix.
    EigenDecomposition(org.apache.commons.math3.linear.RealMatrix matrix, double splitTolerance)
    Deprecated.
    in 3.1 (to be removed in 4.0) due to unused parameter
  • Method Summary

    Modifier and Type
    Method
    Description
    org.apache.commons.math3.linear.RealMatrix
    Gets the block diagonal matrix D of the decomposition.
    double
    Computes the determinant of the matrix.
    org.apache.commons.math3.linear.RealVector
    Gets a copy of the ith eigenvector of the original matrix.
    double
    Gets the imaginary part of the ith eigenvalue of the original matrix.
    double[]
    Gets a copy of the imaginary parts of the eigenvalues of the original matrix.
    double
    Returns the real part of the ith eigenvalue of the original matrix.
    double[]
    Gets a copy of the real parts of the eigenvalues of the original matrix.
    org.apache.commons.math3.linear.DecompositionSolver
    Gets a solver for finding the A × X = B solution in exact linear sense.
    org.apache.commons.math3.linear.RealMatrix
    Computes the square-root of the matrix.
    org.apache.commons.math3.linear.RealMatrix
    Gets the matrix V of the decomposition.
    org.apache.commons.math3.linear.RealMatrix
    Gets the transpose of the matrix V of the decomposition.
    boolean
    Returns whether the calculated eigen values are complex or real.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • EigenDecomposition

      public EigenDecomposition(org.apache.commons.math3.linear.RealMatrix matrix) throws org.apache.commons.math3.exception.MathArithmeticException
      Calculates the eigen decomposition of the given real matrix.

      Supports decomposition of a general matrix since 3.1.

      Parameters:
      matrix - Matrix to decompose.
      Throws:
      org.apache.commons.math3.exception.MaxCountExceededException - if the algorithm fails to converge.
      org.apache.commons.math3.exception.MathArithmeticException - if the decomposition of a general matrix results in a matrix with zero norm
      Since:
      3.1
    • EigenDecomposition

      @Deprecated public EigenDecomposition(org.apache.commons.math3.linear.RealMatrix matrix, double splitTolerance) throws org.apache.commons.math3.exception.MathArithmeticException
      Deprecated.
      in 3.1 (to be removed in 4.0) due to unused parameter
      Calculates the eigen decomposition of the given real matrix.
      Parameters:
      matrix - Matrix to decompose.
      splitTolerance - Dummy parameter (present for backward compatibility only).
      Throws:
      org.apache.commons.math3.exception.MathArithmeticException - if the decomposition of a general matrix results in a matrix with zero norm
      org.apache.commons.math3.exception.MaxCountExceededException - if the algorithm fails to converge.
    • EigenDecomposition

      public EigenDecomposition(double[] main, double[] secondary)
      Calculates the eigen decomposition of the symmetric tridiagonal matrix. The Householder matrix is assumed to be the identity matrix.
      Parameters:
      main - Main diagonal of the symmetric tridiagonal form.
      secondary - Secondary of the tridiagonal form.
      Throws:
      org.apache.commons.math3.exception.MaxCountExceededException - if the algorithm fails to converge.
      Since:
      3.1
    • EigenDecomposition

      @Deprecated public EigenDecomposition(double[] main, double[] secondary, double splitTolerance)
      Deprecated.
      in 3.1 (to be removed in 4.0) due to unused parameter
      Calculates the eigen decomposition of the symmetric tridiagonal matrix. The Householder matrix is assumed to be the identity matrix.
      Parameters:
      main - Main diagonal of the symmetric tridiagonal form.
      secondary - Secondary of the tridiagonal form.
      splitTolerance - Dummy parameter (present for backward compatibility only).
      Throws:
      org.apache.commons.math3.exception.MaxCountExceededException - if the algorithm fails to converge.
  • Method Details

    • getV

      public org.apache.commons.math3.linear.RealMatrix getV()
      Gets the matrix V of the decomposition. 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).
      Returns:
      the V matrix.
    • getD

      public org.apache.commons.math3.linear.RealMatrix getD()
      Gets the block diagonal matrix D of the decomposition. D is a block diagonal matrix. Real eigenvalues are on the diagonal while complex values are on 2x2 blocks { {real +imaginary}, {-imaginary, real} }.
      Returns:
      the D matrix.
      See Also:
    • getVT

      public org.apache.commons.math3.linear.RealMatrix getVT()
      Gets the transpose of the matrix V of the decomposition. 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).
      Returns:
      the transpose of the V matrix.
    • hasComplexEigenvalues

      public boolean hasComplexEigenvalues()
      Returns whether the calculated eigen values are complex or real.

      The method performs a zero check for each element of the getImagEigenvalues() array and returns true if any element is not equal to zero.

      Returns:
      true if the eigen values are complex, false otherwise
      Since:
      3.1
    • getRealEigenvalues

      public double[] getRealEigenvalues()
      Gets a copy of the real parts of the eigenvalues of the original matrix.
      Returns:
      a copy of the real parts of the eigenvalues of the original matrix.
      See Also:
    • getRealEigenvalue

      public double getRealEigenvalue(int i)
      Returns the real part of the ith eigenvalue of the original matrix.
      Parameters:
      i - index of the eigenvalue (counting from 0)
      Returns:
      real part of the ith eigenvalue of the original matrix.
      See Also:
    • getImagEigenvalues

      public double[] getImagEigenvalues()
      Gets a copy of the imaginary parts of the eigenvalues of the original matrix.
      Returns:
      a copy of the imaginary parts of the eigenvalues of the original matrix.
      See Also:
    • getImagEigenvalue

      public double getImagEigenvalue(int i)
      Gets the imaginary part of the ith eigenvalue of the original matrix.
      Parameters:
      i - Index of the eigenvalue (counting from 0).
      Returns:
      the imaginary part of the ith eigenvalue of the original matrix.
      See Also:
    • getEigenvector

      public org.apache.commons.math3.linear.RealVector getEigenvector(int i)
      Gets a copy of the ith eigenvector of the original matrix.
      Parameters:
      i - Index of the eigenvector (counting from 0).
      Returns:
      a copy of the ith eigenvector of the original matrix.
      See Also:
    • getDeterminant

      public double getDeterminant()
      Computes the determinant of the matrix.
      Returns:
      the determinant of the matrix.
    • getSquareRoot

      public org.apache.commons.math3.linear.RealMatrix getSquareRoot()
      Computes the square-root of the matrix. This implementation assumes that the matrix is symmetric and positive definite.
      Returns:
      the square-root of the matrix.
      Throws:
      org.apache.commons.math3.exception.MathUnsupportedOperationException - if the matrix is not symmetric or not positive definite.
      Since:
      3.1
    • getSolver

      public org.apache.commons.math3.linear.DecompositionSolver getSolver()
      Gets a solver for finding the A × X = B solution in exact linear sense.

      Since 3.1, eigen decomposition of a general matrix is supported, but the DecompositionSolver only supports real eigenvalues.

      Returns:
      a solver
      Throws:
      org.apache.commons.math3.exception.MathUnsupportedOperationException - if the decomposition resulted in complex eigenvalues