Class SvdImplicitQrAlgorithm_FDRM
java.lang.Object
org.ejml.dense.row.decomposition.svd.implicitqr.SvdImplicitQrAlgorithm_FDRM
@Generated("org.ejml.dense.row.decomposition.svd.implicitqr.SvdImplicitQrAlgorithm_DDRM")
public class SvdImplicitQrAlgorithm_FDRM
extends Object
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
Modifier and TypeFieldDescriptionprotected float[]
protected EigenvalueSmall_F32
protected float
protected int
protected int
protected int
protected int
protected float[]
protected Random
protected int[]
protected int
protected @Nullable FMatrixRMaj
protected @Nullable FMatrixRMaj
protected int
protected int
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionboolean
_process()
protected boolean
Checks to see if either the diagonal element or off diagonal element is zero.protected void
computeRotator
(float rise, float run) Computes a rotator that will set run to zero (?)protected void
createBulge
(int x1, float p, float scale, boolean byAngle) Performs a similar transform on BTB-pIprotected void
eigenBB_2x2
(int x1) Computes the eigenvalue of the 2 by 2 matrix BTBvoid
It is possible for the QR algorithm to get stuck in a loop because of symmetries.float[]
getDiag()
float
int
float[]
getOff()
float
getSingularValue
(int index) float[]
@Nullable FMatrixRMaj
getUt()
@Nullable FMatrixRMaj
getVt()
void
void
initParam
(int M, int N) boolean
isDiagonalZero
(int i) boolean
isOffZero
(int i) boolean
Tells it to process the submatrix at the next split.void
performImplicitSingleStep
(float scale, float lambda, boolean byAngle) Given the lambda value perform an implicit QR step on the matrix.void
boolean
process()
boolean
process
(float[] values) Perform a sequence of steps based off of the singular values provided.protected void
removeBulgeLeft
(int x1, boolean notLast) protected void
removeBulgeRight
(int x1) void
float
selectWilkinsonShift
(float scale) Selects the Wilkinson's shift for BTB.void
setFastValues
(boolean b) void
setMatrix
(int numRows, int numCols, float[] diag, float[] off) void
setMaxValue
(float maxValue) void
setSubmatrix
(int x1, int x2) void
setUt
(@Nullable FMatrixRMaj ut) void
setVt
(@Nullable FMatrixRMaj vt) float[]
swapDiag
(float[] diag) float[]
swapOff
(float[] off) protected void
updateRotator
(FMatrixRMaj Q, int m, int n, float c, float s) Multiplied a transpose orthogonal matrix Q by the specified rotator.
-
Field Details
-
rand
-
Ut
-
Vt
-
totalSteps
protected int totalSteps -
maxValue
protected float maxValue -
N
protected int N -
eigenSmall
-
numExceptional
protected int numExceptional -
nextExceptional
protected int nextExceptional -
diag
protected float[] diag -
off
protected float[] off -
x1
protected int x1 -
x2
protected int x2 -
splits
protected int[] splits -
numSplits
protected int numSplits
-
-
Constructor Details
-
SvdImplicitQrAlgorithm_FDRM
public SvdImplicitQrAlgorithm_FDRM(boolean fastValues) -
SvdImplicitQrAlgorithm_FDRM
public SvdImplicitQrAlgorithm_FDRM()
-
-
Method Details
-
getUt
-
setUt
-
getVt
-
setVt
-
setMatrix
public void setMatrix(int numRows, int numCols, float[] diag, float[] off) -
swapDiag
public float[] swapDiag(float[] diag) -
swapOff
public float[] swapOff(float[] off) -
setMaxValue
public void setMaxValue(float maxValue) -
initParam
public void initParam(int M, int N) -
process
public boolean process() -
process
public boolean process(float[] 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(float scale, float 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, float p, float scale, boolean byAngle) Performs a similar transform on BTB-pI -
computeRotator
protected void computeRotator(float rise, float 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 float selectWilkinsonShift(float 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 float getSingularValue(int index) -
setFastValues
public void setFastValues(boolean b) -
getSingularValues
public float[] getSingularValues() -
getDiag
public float[] getDiag() -
getOff
public float[] getOff() -
getMaxValue
public float getMaxValue()
-