Class QRDecompositionHouseholder_FDRM
- java.lang.Object
-
- org.ejml.dense.row.decomposition.qr.QRDecompositionHouseholder_FDRM
-
- All Implemented Interfaces:
org.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.FMatrixRMaj>,org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRMaj>
public class QRDecompositionHouseholder_FDRM extends java.lang.Object implements org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRMaj>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, 2002For 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 float[]dataQRprotected booleanerrorprotected floatgammaprotected float[]gammasprotected intminLengthprotected intnumColsprotected intnumRowsprotected org.ejml.data.FMatrixRMajQRWhere the Q and R matrices are stored.protected floattauprotected float[]uprotected float[]v
-
Constructor Summary
Constructors Constructor Description QRDecompositionHouseholder_FDRM()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidcommonSetup(org.ejml.data.FMatrixRMaj A)This function performs sanity check on the input for decompose and sets up the QR matrix.booleandecompose(org.ejml.data.FMatrixRMaj A)In order to decompose the matrix 'A' it must have full rank.float[]getGammas()org.ejml.data.FMatrixRMajgetQ(org.ejml.data.FMatrixRMaj Q, boolean compact)Computes the Q matrix from the imformation stored in the QR matrix.org.ejml.data.FMatrixRMajgetQR()Returns a single matrix which contains the combined values of Q and R.org.ejml.data.FMatrixRMajgetR(org.ejml.data.FMatrixRMaj R, boolean compact)Returns an upper triangular matrix which is the R in the QR decomposition.protected voidhouseholder(int j)Computes the householder vector "u" for the first column of submatrix j.booleaninputModified()voidsetExpectedMaxSize(int numRows, int numCols)protected voidupdateA(int w)Takes the results from the householder computation and updates the 'A' matrix.
A = (I - γ*u*uT)A
-
-
-
Field Detail
-
QR
protected org.ejml.data.FMatrixRMaj 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 float[] u
-
v
protected float[] v
-
numCols
protected int numCols
-
numRows
protected int numRows
-
minLength
protected int minLength
-
dataQR
protected float[] dataQR
-
gammas
protected float[] gammas
-
gamma
protected float gamma
-
tau
protected float tau
-
error
protected boolean error
-
-
Method Detail
-
setExpectedMaxSize
public void setExpectedMaxSize(int numRows, int numCols)
-
getQR
public org.ejml.data.FMatrixRMaj 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.FMatrixRMaj getQ(org.ejml.data.FMatrixRMaj 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:
getQin interfaceorg.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRMaj>- Parameters:
Q- The orthogonal Q matrix.
-
getR
public org.ejml.data.FMatrixRMaj getR(org.ejml.data.FMatrixRMaj R, boolean compact)Returns an upper triangular matrix which is the R in the QR decomposition.- Specified by:
getRin interfaceorg.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRMaj>- Parameters:
R- An upper triangular matrix.compact-
-
decompose
public boolean decompose(org.ejml.data.FMatrixRMaj 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:
decomposein interfaceorg.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.FMatrixRMaj>
-
inputModified
public boolean inputModified()
- Specified by:
inputModifiedin interfaceorg.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.FMatrixRMaj>
-
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.FMatrixRMaj A)
This function performs sanity check on the input for decompose and sets up the QR matrix.- Parameters:
A-
-
getGammas
public float[] getGammas()
-
-