public class HouseholderQR extends Object implements QRDecomposition
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 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.
| Modifier and Type | Field and Description |
|---|---|
protected double[] |
dataQR |
protected boolean |
error |
protected double |
gamma |
protected double[] |
gammas |
protected int |
minLength |
protected int |
numCols |
protected int |
numRows |
protected Matrix |
QR
Where the Q and R matrices are stored.
|
protected double |
tau |
protected double[] |
u |
protected double[] |
v |
| Constructor and Description |
|---|
HouseholderQR(boolean compact) |
| Modifier and Type | Method and Description |
|---|---|
protected AMatrix |
computeQ()
Computes the Q matrix from the information stored in the QR matrix.
|
protected AMatrix |
computeR()
Returns an upper triangular matrix which is the R in the QR decomposition.
|
QRResult |
decompose(AMatrix A)
In order to decompose the matrix 'A' it must have full rank.
|
double[] |
getGammas() |
AMatrix |
getQ() |
AMatrix |
getQR()
Returns a single matrix which contains the combined values of Q and R.
|
AMatrix |
getR() |
protected void |
householder(int j)
Computes the householder vector "u" for the first column of submatrix j.
|
protected void |
updateA(int w)
Takes the results from the householder computation and updates the 'A' matrix.
A = (I - γ*u*uT)A |
protected Matrix QR
protected double[] u
protected double[] v
protected int numCols
protected int numRows
protected int minLength
protected double[] dataQR
protected double[] gammas
protected double gamma
protected double tau
protected boolean error
public AMatrix getQR()
public AMatrix getQ()
public AMatrix getR()
protected AMatrix computeQ()
protected AMatrix computeR()
public QRResult decompose(AMatrix 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.
decompose in interface QRDecompositionprotected void householder(int j)
Computes the householder vector "u" for the first column of submatrix j. Note this is a specialised householder for this problem. There is some protection against overflow and underflow.
Q = I - γuuT
This function finds the values of 'u' and 'γ'.
j - Which submatrix to work off of.protected void updateA(int w)
Takes the results from the householder computation and updates the 'A' matrix.
A = (I - γ*u*uT)A
w - The submatrix.public double[] getGammas()
Copyright © 2016. All rights reserved.