Class QRDecompositionHouseholder_DDRM

  • All Implemented Interfaces:
    org.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.DMatrixRMaj>, org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.DMatrixRMaj>

    public class QRDecompositionHouseholder_DDRM
    extends java.lang.Object
    implements org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.DMatrixRMaj>

    This variation of QR decomposition uses reflections to compute the Q matrix. Each reflection uses a householder operations, hence its name. To provide a meaningful solution the original matrix must have full rank. This is intended for processing of small to medium matrices.

    Both Q and R are stored in the same m by n matrix. Q is not stored directly, instead the u from Qk=(I-γ*u*uT) is stored. Decomposition requires about 2n*m2-2m2/3 flops.

    See the QR reflections algorithm described in:
    David S. Watkins, "Fundamentals of Matrix Computations" 2nd Edition, 2002

    For the most part this is a straight forward implementation. To improve performance on large matrices a column is writen to an array and the order of some of the loops has been changed. This will degrade performance noticeably on small matrices. Since it is unlikely that the QR decomposition would be a bottle neck when small matrices are involved only one implementation is provided.

    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected double[] dataQR  
      protected boolean error  
      protected double gamma  
      protected double[] gammas  
      protected int minLength  
      protected int numCols  
      protected int numRows  
      protected org.ejml.data.DMatrixRMaj QR
      Where the Q and R matrices are stored.
      protected double tau  
      protected double[] u  
      protected double[] v  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void commonSetup​(org.ejml.data.DMatrixRMaj A)
      This function performs sanity check on the input for decompose and sets up the QR matrix.
      boolean decompose​(org.ejml.data.DMatrixRMaj A)
      In order to decompose the matrix 'A' it must have full rank.
      double[] getGammas()  
      org.ejml.data.DMatrixRMaj getQ​(org.ejml.data.DMatrixRMaj Q, boolean compact)
      Computes the Q matrix from the imformation stored in the QR matrix.
      org.ejml.data.DMatrixRMaj getQR()
      Returns a single matrix which contains the combined values of Q and R.
      org.ejml.data.DMatrixRMaj getR​(org.ejml.data.DMatrixRMaj R, boolean compact)
      Returns an upper triangular matrix which is the R in the QR decomposition.
      protected void householder​(int j)
      Computes the householder vector "u" for the first column of submatrix j.
      boolean inputModified()  
      void setExpectedMaxSize​(int numRows, int numCols)  
      protected void updateA​(int w)
      Takes the results from the householder computation and updates the 'A' matrix.

      A = (I - γ*u*uT)A
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • QR

        protected org.ejml.data.DMatrixRMaj QR
        Where the Q and R matrices are stored. R is stored in the upper triangular portion and Q on the lower bit. Lower columns are where u is stored. Q_k = (I - gamma_k*u_k*u_k^T).
      • u

        protected double[] u
      • v

        protected double[] v
      • numCols

        protected int numCols
      • numRows

        protected int numRows
      • minLength

        protected int minLength
      • dataQR

        protected double[] dataQR
      • gammas

        protected double[] gammas
      • gamma

        protected double gamma
      • tau

        protected double tau
      • error

        protected boolean error
    • Constructor Detail

      • QRDecompositionHouseholder_DDRM

        public QRDecompositionHouseholder_DDRM()
    • Method Detail

      • setExpectedMaxSize

        public void setExpectedMaxSize​(int numRows,
                                       int numCols)
      • getQR

        public org.ejml.data.DMatrixRMaj getQR()
        Returns a single matrix which contains the combined values of Q and R. This is possible since Q is symmetric and R is upper triangular.
        Returns:
        The combined Q R matrix.
      • getQ

        public org.ejml.data.DMatrixRMaj getQ​(org.ejml.data.DMatrixRMaj Q,
                                              boolean compact)
        Computes the Q matrix from the imformation stored in the QR matrix. This operation requires about 4(m2n-mn2+n3/3) flops.
        Specified by:
        getQ in interface org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.DMatrixRMaj>
        Parameters:
        Q - The orthogonal Q matrix.
      • getR

        public org.ejml.data.DMatrixRMaj getR​(org.ejml.data.DMatrixRMaj R,
                                              boolean compact)
        Returns an upper triangular matrix which is the R in the QR decomposition.
        Specified by:
        getR in interface org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.DMatrixRMaj>
        Parameters:
        R - An upper triangular matrix.
        compact -
      • decompose

        public boolean decompose​(org.ejml.data.DMatrixRMaj A)

        In order to decompose the matrix 'A' it must have full rank. 'A' is a 'm' by 'n' matrix. It requires about 2n*m2-2m2/3 flops.

        The matrix provided here can be of different dimension than the one specified in the constructor. It just has to be smaller than or equal to it.

        Specified by:
        decompose in interface org.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.DMatrixRMaj>
      • inputModified

        public boolean inputModified()
        Specified by:
        inputModified in interface org.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.DMatrixRMaj>
      • householder

        protected void householder​(int j)

        Computes the householder vector "u" for the first column of submatrix j. Note this is a specialized householder for this problem. There is some protection against overflow and underflow.

        Q = I - γuuT

        This function finds the values of 'u' and 'γ'.

        Parameters:
        j - Which submatrix to work off of.
      • updateA

        protected void updateA​(int w)

        Takes the results from the householder computation and updates the 'A' matrix.

        A = (I - γ*u*uT)A

        Parameters:
        w - The submatrix.
      • commonSetup

        protected void commonSetup​(org.ejml.data.DMatrixRMaj A)
        This function performs sanity check on the input for decompose and sets up the QR matrix.
        Parameters:
        A -
      • getGammas

        public double[] getGammas()