Class SvdImplicitQrAlgorithm_DDRM
java.lang.Object
org.ejml.dense.row.decomposition.svd.implicitqr.SvdImplicitQrAlgorithm_DDRM
Computes the QR decomposition of a bidiagonal matrix. Internally this matrix is stored as
two arrays. Shifts can either be provided to it or it can generate the shifts on its own.
It optionally computes the U and V matrices. This comparability allows it to be used to
compute singular values and associated matrices efficiently.
A = U*S*VT
where A is the original m by n matrix.
Based off of the outline provided in:
David S. Watkins, "Fundamentals of Matrix Computations," Second Edition. Page 404-411
Note: To watch it process the matrix step by step uncomment commented out code.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprotected double[]protected EigenvalueSmall_F64protected doubleprotected intprotected intprotected intprotected intprotected double[]protected Randomprotected int[]protected intprotected @Nullable DMatrixRMajprotected @Nullable DMatrixRMajprotected intprotected int -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionboolean_process()protected booleanChecks to see if either the diagonal element or off diagonal element is zero.protected voidcomputeRotator(double rise, double run) Computes a rotator that will set run to zero (?)protected voidcreateBulge(int x1, double p, double scale, boolean byAngle) Performs a similar transform on BTB-pIprotected voideigenBB_2x2(int x1) Computes the eigenvalue of the 2 by 2 matrix BTBvoidIt is possible for the QR algorithm to get stuck in a loop because of symmetries.double[]getDiag()doubleintdouble[]getOff()doublegetSingularValue(int index) double[]@Nullable DMatrixRMajgetUt()@Nullable DMatrixRMajgetVt()voidvoidinitParam(int M, int N) booleanisDiagonalZero(int i) booleanisOffZero(int i) booleanTells it to process the submatrix at the next split.voidperformImplicitSingleStep(double scale, double lambda, boolean byAngle) Given the lambda value perform an implicit QR step on the matrix.voidbooleanprocess()booleanprocess(double[] values) Perform a sequence of steps based off of the singular values provided.protected voidremoveBulgeLeft(int x1, boolean notLast) protected voidremoveBulgeRight(int x1) voiddoubleselectWilkinsonShift(double scale) Selects the Wilkinson's shift for BTB.voidsetFastValues(boolean b) voidsetMatrix(int numRows, int numCols, double[] diag, double[] off) voidsetMaxValue(double maxValue) voidsetSubmatrix(int x1, int x2) voidsetUt(@Nullable DMatrixRMaj ut) voidsetVt(@Nullable DMatrixRMaj vt) double[]swapDiag(double[] diag) double[]swapOff(double[] off) protected voidupdateRotator(DMatrixRMaj Q, int m, int n, double c, double s) Multiplied a transpose orthogonal matrix Q by the specified rotator.
-
Field Details
-
rand
-
Ut
-
Vt
-
totalSteps
protected int totalSteps -
maxValue
protected double maxValue -
N
protected int N -
eigenSmall
-
numExceptional
protected int numExceptional -
nextExceptional
protected int nextExceptional -
diag
protected double[] diag -
off
protected double[] off -
x1
protected int x1 -
x2
protected int x2 -
splits
protected int[] splits -
numSplits
protected int numSplits
-
-
Constructor Details
-
SvdImplicitQrAlgorithm_DDRM
public SvdImplicitQrAlgorithm_DDRM(boolean fastValues) -
SvdImplicitQrAlgorithm_DDRM
public SvdImplicitQrAlgorithm_DDRM()
-
-
Method Details
-
getUt
-
setUt
-
getVt
-
setVt
-
setMatrix
public void setMatrix(int numRows, int numCols, double[] diag, double[] off) -
swapDiag
public double[] swapDiag(double[] diag) -
swapOff
public double[] swapOff(double[] off) -
setMaxValue
public void setMaxValue(double maxValue) -
initParam
public void initParam(int M, int N) -
process
public boolean process() -
process
public boolean process(double[] values) Perform a sequence of steps based off of the singular values provided. -
_process
public boolean _process() -
incrementSteps
public void incrementSteps() -
isOffZero
public boolean isOffZero(int i) -
isDiagonalZero
public boolean isDiagonalZero(int i) -
resetSteps
public void resetSteps() -
nextSplit
public boolean nextSplit()Tells it to process the submatrix at the next split. Should be called after the current submatrix has been processed. -
performImplicitSingleStep
public void performImplicitSingleStep(double scale, double lambda, boolean byAngle) Given the lambda value perform an implicit QR step on the matrix. B^T*B-lambda*I- Parameters:
lambda- Stepping factor.
-
updateRotator
Multiplied a transpose orthogonal matrix Q by the specified rotator. This is used to update the U and V matrices. Updating the transpose of the matrix is faster since it only modifies the rows.- Parameters:
Q- Orthogonal matrixm- Coordinate of rotator.n- Coordinate of rotator.c- cosine of rotator.s- sine of rotator.
-
createBulge
protected void createBulge(int x1, double p, double scale, boolean byAngle) Performs a similar transform on BTB-pI -
computeRotator
protected void computeRotator(double rise, double run) Computes a rotator that will set run to zero (?) -
removeBulgeLeft
protected void removeBulgeLeft(int x1, boolean notLast) -
removeBulgeRight
protected void removeBulgeRight(int x1) -
setSubmatrix
public void setSubmatrix(int x1, int x2) -
selectWilkinsonShift
public double selectWilkinsonShift(double scale) Selects the Wilkinson's shift for BTB. See page 410. It is guaranteed to converge and converges fast in practice.- Parameters:
scale- Scale factor used to help prevent overflow/underflow- Returns:
- Shifting factor lambda/(scale*scale)
-
eigenBB_2x2
protected void eigenBB_2x2(int x1) Computes the eigenvalue of the 2 by 2 matrix BTB -
checkForAndHandleZeros
protected boolean checkForAndHandleZeros()Checks to see if either the diagonal element or off diagonal element is zero. If one is then it performs a split or pushes it off the matrix.- Returns:
- True if there was a zero.
-
exceptionShift
public void exceptionShift()It is possible for the QR algorithm to get stuck in a loop because of symmetries. This happens more often with larger matrices. By taking a random step it can break the symmetry and finish. -
printMatrix
public void printMatrix() -
getNumberOfSingularValues
public int getNumberOfSingularValues() -
getSingularValue
public double getSingularValue(int index) -
setFastValues
public void setFastValues(boolean b) -
getSingularValues
public double[] getSingularValues() -
getDiag
public double[] getDiag() -
getOff
public double[] getOff() -
getMaxValue
public double getMaxValue()
-