Class SchurTransformer

java.lang.Object
org.apache.commons.math3.linear.SchurTransformer

class SchurTransformer extends Object
Class transforming a general real matrix to Schur form.

A m × m matrix A can be written as the product of three matrices: A = P × T × PT with P an orthogonal matrix and T an quasi-triangular matrix. Both P and T are m × m matrices.

Transformation to Schur form is often not a goal by itself, but it is an intermediate step in more general decomposition algorithms like eigen decomposition. This class is therefore intended for internal use by the library and is not public. As a consequence of this explicitly limited scope, many methods directly returns references to internal arrays, not copies.

This class is based on the method hqr2 in class EigenvalueDecomposition from the JAMA library.

Since:
3.1
See Also:
  • Field Details

    • MAX_ITERATIONS

      private static final int MAX_ITERATIONS
      Maximum allowed iterations for convergence of the transformation.
      See Also:
    • matrixP

      private final double[][] matrixP
      P matrix.
    • matrixT

      private final double[][] matrixT
      T matrix.
    • cachedP

      private RealMatrix cachedP
      Cached value of P.
    • cachedT

      private RealMatrix cachedT
      Cached value of T.
    • cachedPt

      private RealMatrix cachedPt
      Cached value of PT.
    • epsilon

      private final double epsilon
      Epsilon criteria taken from JAMA code (originally was 2^-52).
  • Constructor Details

    • SchurTransformer

      SchurTransformer(RealMatrix matrix)
      Build the transformation to Schur form of a general real matrix.
      Parameters:
      matrix - matrix to transform
      Throws:
      NonSquareMatrixException - if the matrix is not square
  • Method Details

    • getP

      public RealMatrix getP()
      Returns the matrix P of the transform.

      P is an orthogonal matrix, i.e. its inverse is also its transpose.

      Returns:
      the P matrix
    • getPT

      public RealMatrix getPT()
      Returns the transpose of the matrix P of the transform.

      P is an orthogonal matrix, i.e. its inverse is also its transpose.

      Returns:
      the transpose of the P matrix
    • getT

      public RealMatrix getT()
      Returns the quasi-triangular Schur matrix T of the transform.
      Returns:
      the T matrix
    • transform

      private void transform()
      Transform original matrix to Schur form.
      Throws:
      MaxCountExceededException - if the transformation does not converge
    • getNorm

      private double getNorm()
      Computes the L1 norm of the (quasi-)triangular matrix T.
      Returns:
      the L1 norm of matrix T
    • findSmallSubDiagonalElement

      private int findSmallSubDiagonalElement(int startIdx, double norm)
      Find the first small sub-diagonal element and returns its index.
      Parameters:
      startIdx - the starting index for the search
      norm - the L1 norm of the matrix
      Returns:
      the index of the first small sub-diagonal element
    • computeShift

      private void computeShift(int l, int idx, int iteration, SchurTransformer.ShiftInfo shift)
      Compute the shift for the current iteration.
      Parameters:
      l - the index of the small sub-diagonal element
      idx - the current eigenvalue index
      iteration - the current iteration
      shift - holder for shift information
    • initQRStep

      private int initQRStep(int il, int iu, SchurTransformer.ShiftInfo shift, double[] hVec)
      Initialize the householder vectors for the QR step.
      Parameters:
      il - the index of the small sub-diagonal element
      iu - the current eigenvalue index
      shift - shift information holder
      hVec - the initial houseHolder vector
      Returns:
      the start index for the QR step
    • performDoubleQRStep

      private void performDoubleQRStep(int il, int im, int iu, SchurTransformer.ShiftInfo shift, double[] hVec)
      Perform a double QR step involving rows l:idx and columns m:n
      Parameters:
      il - the index of the small sub-diagonal element
      im - the start index for the QR step
      iu - the current eigenvalue index
      shift - shift information holder
      hVec - the initial houseHolder vector