Class QRDecompositionHouseholder_CDRM
- All Implemented Interfaces:
DecompositionInterface<CMatrixRMaj>
,QRDecomposition<CMatrixRMaj>
This variation of complex 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*uH) 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 written 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
Modifier and TypeFieldDescriptionprotected float[]
protected boolean
protected float[]
protected int
protected int
protected int
protected CMatrixRMaj
Where the Q and R matrices are stored.protected Complex_F32
protected float[]
protected float[]
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected void
This function performs sanity check on the input for decompose and sets up the QR matrix.boolean
In order to decompose the matrix 'A' it must have full rank.float[]
getQ
(@Nullable CMatrixRMaj Q, boolean compact) Computes the Q matrix from the information stored in the QR matrix.getQR()
Returns a single matrix which contains the combined values of Q and R.getR
(@Nullable CMatrixRMaj 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
Checks if the input matrix toDecompositionInterface.decompose(org.ejml.data.Matrix)
is modified during the decomposition process.void
setExpectedMaxSize
(int numRows, int numCols)
-
Field Details
-
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^H). -
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 -
tau
-
error
protected boolean error
-
-
Constructor Details
-
QRDecompositionHouseholder_CDRM
public QRDecompositionHouseholder_CDRM()
-
-
Method Details
-
setExpectedMaxSize
public void setExpectedMaxSize(int numRows, int numCols) -
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
Computes the Q matrix from the information stored in the QR matrix. This operation requires about 4(m2n-mn2+n3/3) flops.- Specified by:
getQ
in interfaceQRDecomposition<CMatrixRMaj>
- Parameters:
Q
- The orthogonal Q matrix.compact
- If true an m by n matrix is created, otherwise n by n.- Returns:
- The Q matrix.
-
getR
Returns an upper triangular matrix which is the R in the QR decomposition.- Specified by:
getR
in interfaceQRDecomposition<CMatrixRMaj>
- Parameters:
R
- An upper triangular matrix.compact
- If true only the upper triangular elements are set- Returns:
- The R matrix.
-
decompose
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 interfaceDecompositionInterface<CMatrixRMaj>
- Parameters:
A
- The matrix which is being decomposed. Modification is implementation dependent.- Returns:
- Returns if it was able to decompose the matrix.
-
inputModified
public boolean inputModified()Description copied from interface:DecompositionInterface
Checks if the input matrix toDecompositionInterface.decompose(org.ejml.data.Matrix)
is modified during the decomposition process.- Specified by:
inputModified
in interfaceDecompositionInterface<CMatrixRMaj>
- Returns:
- true if the input matrix to decompose() is modified.
-
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 - γuuH
This function finds the values of 'u' and 'γ'.
- Parameters:
j
- Which submatrix to work off of.
-
commonSetup
This function performs sanity check on the input for decompose and sets up the QR matrix. -
getGammas
public float[] getGammas()
-