public class QRDecompositionHouseholder_FDRB
extends java.lang.Object
implements org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRBlock>
QR decomposition for FMatrixRBlock
using householder reflectors. The decomposition is
performed by computing a QR decomposition for each block column as is normally done, see QRDecompositionHouseholder_FDRM
.
The reflectors are then combined and applied to the remainder of the matrix. This process is repeated
until all the block columns have been processed
The input matrix is modified and used to store the decomposition. Reflectors are stored in the lower triangle columns. The first element of the reflector is implicitly assumed to be one.
Each iteration can be sketched as follows:QR_Decomposition( A(:,i-r to i) ) W=computeW( A(:,i-r to i) ) A(:,i:n) = (I + W*Y^T)^T*A(:,i:n)Where r is the block size, i is the submatrix being considered, A is the input matrix, Y is a matrix containing the reflectors just computed, and W is computed using
BlockHouseHolder_FDRB.computeW_Column(int, org.ejml.data.FSubmatrixD1, org.ejml.data.FSubmatrixD1, float[], float[], int)
.
Based upon "Block Householder QR Factorization" pg 255 in "Matrix Computations" 3rd Ed. 1996 by Gene H. Golub and Charles F. Van Loan.
Constructor and Description |
---|
QRDecompositionHouseholder_FDRB() |
Modifier and Type | Method and Description |
---|---|
void |
applyQ(org.ejml.data.FMatrixRBlock B)
Multiplies the provided matrix by Q using householder reflectors.
|
void |
applyQ(org.ejml.data.FMatrixRBlock B,
boolean isIdentity)
Specialized version of applyQ() that allows the zeros in an identity matrix
to be taken advantage of depending on if isIdentity is true or not.
|
void |
applyQTran(org.ejml.data.FMatrixRBlock B)
Multiplies the provided matrix by QT using householder reflectors.
|
boolean |
decompose(org.ejml.data.FMatrixRBlock orig) |
org.ejml.data.FMatrixRBlock |
getQ(org.ejml.data.FMatrixRBlock Q,
boolean compact) |
org.ejml.data.FMatrixRBlock |
getQR()
This is the input matrix after it has been overwritten with the decomposition.
|
org.ejml.data.FMatrixRBlock |
getR(org.ejml.data.FMatrixRBlock R,
boolean compact) |
static org.ejml.data.FMatrixRBlock |
initializeQ(org.ejml.data.FMatrixRBlock Q,
int numRows,
int numCols,
int blockLength,
boolean compact)
Sanity checks the input or declares a new matrix.
|
boolean |
inputModified()
The input matrix is always modified.
|
void |
setSaveW(boolean saveW)
Sets if it should internally save the W matrix before performing the decomposition.
|
protected void |
updateA(org.ejml.data.FSubmatrixD1 A)
A = (I + W YT)TA
A = A + Y (WTA) where A is a submatrix of the input matrix. |
public org.ejml.data.FMatrixRBlock getQR()
public void setSaveW(boolean saveW)
Sets if it should internally save the W matrix before performing the decomposition. Must be set before decomposition the matrix.
Saving W can result in about a 5% savings when solving systems around a height of 5k. The price is that it needs to save a matrix the size of the input matrix.
saveW
- If the W matrix should be saved or not.public org.ejml.data.FMatrixRBlock getQ(org.ejml.data.FMatrixRBlock Q, boolean compact)
getQ
in interface org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRBlock>
public static org.ejml.data.FMatrixRBlock initializeQ(org.ejml.data.FMatrixRBlock Q, int numRows, int numCols, int blockLength, boolean compact)
public void applyQ(org.ejml.data.FMatrixRBlock B)
Multiplies the provided matrix by Q using householder reflectors. This is more efficient that computing Q then applying it to the matrix.
B = Q * B
B
- Matrix which Q is applied to. Modified.public void applyQ(org.ejml.data.FMatrixRBlock B, boolean isIdentity)
B
- isIdentity
- If B is an identity matrix.public void applyQTran(org.ejml.data.FMatrixRBlock B)
Multiplies the provided matrix by QT using householder reflectors. This is more efficient that computing Q then applying it to the matrix.
Q = Q*(I - γ W*Y^T)
QR = A ≥ R = Q^T*A = (Q3^T * (Q2^T * (Q1^t * A)))
B
- Matrix which Q is applied to. Modified.public org.ejml.data.FMatrixRBlock getR(org.ejml.data.FMatrixRBlock R, boolean compact)
getR
in interface org.ejml.interfaces.decomposition.QRDecomposition<org.ejml.data.FMatrixRBlock>
public boolean decompose(org.ejml.data.FMatrixRBlock orig)
decompose
in interface org.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.FMatrixRBlock>
protected void updateA(org.ejml.data.FSubmatrixD1 A)
A = (I + W YT)TA
A = A + Y (WTA)
where A is a submatrix of the input matrix.
public boolean inputModified()
inputModified
in interface org.ejml.interfaces.decomposition.DecompositionInterface<org.ejml.data.FMatrixRBlock>