Class RawSingularValue
- All Implemented Interfaces:
MatrixDecomposition<Double>
,MatrixDecomposition.EconomySize<Double>
,MatrixDecomposition.Ordered<Double>
,MatrixDecomposition.RankRevealing<Double>
,MatrixDecomposition.Solver<Double>
,MatrixDecomposition.Values<Double>
,SingularValue<Double>
,Provider2D
,Provider2D.Condition
,Provider2D.Inverse<Optional<MatrixStore<Double>>>
,Provider2D.Rank
,Provider2D.Solution<Optional<MatrixStore<Double>>>
,InverterTask<Double>
,MatrixTask<Double>
,SolverTask<Double>
,InvertibleFactor<Double>
,Structure1D
,Structure2D
Singular Value Decomposition.
For an m-by-n matrix A with m >= n, the singular value decomposition is an m-by-n orthogonal matrix U, an n-by-n diagonal matrix S, and an n-by-n orthogonal matrix V so that A = U*S*V'.
The singular values, sigma[k] = S[k][k], are ordered so that sigma[0] >= sigma[1] >= ... >= sigma[n-1].
The singular value decompostion always exists, so the constructor will never fail. The matrix condition number and the effective numerical rank can be computed from this decomposition.
-
Nested Class Summary
Nested classes/interfaces inherited from interface org.ojalgo.matrix.transformation.InvertibleFactor
InvertibleFactor.IdentityFactor<N extends Comparable<N>>
Nested classes/interfaces inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition
MatrixDecomposition.Determinant<N extends Comparable<N>>, MatrixDecomposition.EconomySize<N extends Comparable<N>>, MatrixDecomposition.Factory<D extends MatrixDecomposition<?>>, MatrixDecomposition.Hermitian<N extends Comparable<N>>, MatrixDecomposition.Ordered<N extends Comparable<N>>, MatrixDecomposition.Pivoting<N extends Comparable<N>>, MatrixDecomposition.RankRevealing<N extends Comparable<N>>, MatrixDecomposition.Solver<N extends Comparable<N>>, MatrixDecomposition.Values<N extends Comparable<N>>
Nested classes/interfaces inherited from interface org.ojalgo.matrix.Provider2D
Provider2D.Condition, Provider2D.Determinant<N extends Comparable<N>>, Provider2D.Eigenpairs, Provider2D.Hermitian, Provider2D.Inverse<M>, Provider2D.Rank, Provider2D.Solution<M>, Provider2D.Symmetric, Provider2D.Trace<N extends Comparable<N>>
Nested classes/interfaces inherited from interface org.ojalgo.matrix.decomposition.SingularValue
SingularValue.Factory<N extends Comparable<N>>
Nested classes/interfaces inherited from interface org.ojalgo.structure.Structure1D
Structure1D.BasicMapper<T>, Structure1D.IndexMapper<T>, Structure1D.IntIndex, Structure1D.LongIndex, Structure1D.LoopCallback
Nested classes/interfaces inherited from interface org.ojalgo.structure.Structure2D
Structure2D.IntRowColumn, Structure2D.Logical<S extends Structure2D,
B extends Structure2D.Logical<S, B>>, Structure2D.LongRowColumn, Structure2D.ReducibleTo1D<R extends Structure1D>, Structure2D.Reshapable, Structure2D.RowColumnKey<R, C>, Structure2D.RowColumnMapper<R, C> -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate double[]
private int
Calculation row and column dimensions, possibly transposed from the inputprivate R064Store
private boolean
private double[][]
Arrays for internal storage of U and V.private double[][]
private int
Calculation row and column dimensions, possibly transposed from the inputprivate double[]
Array for internal storage of singular values.private double[]
Fields inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition
TYPICAL
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionvoid
btran
(PhysicalStore<Double> arg) Backwards-transformationprotected boolean
boolean
computeValuesOnly
(Access2D.Collectable<Double, ? super PhysicalStore<Double>> matrix) int
countSignificant
(double threshold) boolean
decompose
(Access2D.Collectable<Double, ? super PhysicalStore<Double>> matrix) (package private) boolean
doDecompose
(Access2D.Collectable<Double, ? super PhysicalStore<Double>> matrix, boolean factors) (package private) MatrixStore
<Double> doGetInverse
(R064Store preallocated) double
The condition number.getD()
double
Sometimes also called the Schatten 2-norm or Hilbert-Schmidt norm.The output must be a "right inverse" and a "generalised inverse".getInverse
(PhysicalStore<Double> preallocated) Implementing this method is optional.double
getKyFanNorm
(int k) Ky Fan k-norm.double
Two normdouble
void
getSingularValues
(double[] values) getSolution
(Access2D.Collectable<Double, ? super PhysicalStore<Double>> rhs) [A][X]=[B] or [this][return]=[rhs]getSolution
(Access2D.Collectable<Double, ? super PhysicalStore<Double>> rhs, PhysicalStore<Double> preallocated) Implementing this method is optional.double
getU()
If [A] is m-by-n and its rank is r, then: The first r columns of [U] span the column space, range or image of [A]. The last m-r columns of [U] span the left nullspace or cokernel of [A]. Calculating the QR decomposition of [A] is a faster alternative.getV()
If [A] is m-by-n and its rank is r, then: The first r columns of [V] span the row space or coimage of [A]. The last n-r columns of [V] span the nullspace or kernel of [A]. Calculating the QR decomposition of [A]T is a faster alternative.invert
(Access2D<?> original, PhysicalStore<Double> preallocated) Exactly how (if at all) a specific implementation makes use ofpreallocated
is not specified by this interface.boolean
boolean
boolean
This is a property of the algorithm/implementation, not the data.boolean
Please note that producing a pseudoinverse and/or a least squares solution is ok! The return value, of this method, is not an indication of if the decomposed matrix is square, has full rank, is postive definite or whatever.preallocate
(Structure2D template) Will create a PhysicalStore instance suitable for use withInverterTask.invert(Access2D, PhysicalStore)
.preallocate
(Structure2D templateBody, Structure2D templateRHS) Will create a PhysicalStore instance suitable for use withSolverTask.solve(Access2D, Access2D, PhysicalStore)
.void
reset()
Delete computed results, and resets attributes to default valuessolve
(Access2D<?> body, Access2D<?> rhs, PhysicalStore<Double> preallocated) Exactly how (if at all) a specific implementation makes use ofpreallocated
is not specified by this interface.Methods inherited from class org.ojalgo.matrix.decomposition.RawDecomposition
allocate, checkSymmetry, collect, function, getColDim, getInternalData, getInternalStore, getRowDim, make, makeDiagonal, newRawStore, reset, scalar, wrap, wrap
Methods inherited from class org.ojalgo.matrix.decomposition.AbstractDecomposition
computed, countColumns, countRows, getDimensionalEpsilon, isAspectRatioNormal, isComputed
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.ojalgo.matrix.task.InverterTask
invert, preallocate
Methods inherited from interface org.ojalgo.matrix.transformation.InvertibleFactor
btran
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition
isComputed
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.RankRevealing
getRank
Methods inherited from interface org.ojalgo.matrix.decomposition.MatrixDecomposition.Solver
compute, ftran, ftran, invert, solve, toInverseProvider, toSolutionProvider
Methods inherited from interface org.ojalgo.matrix.decomposition.SingularValue
reconstruct, reconstruct
Methods inherited from interface org.ojalgo.matrix.task.SolverTask
preallocate, solve
Methods inherited from interface org.ojalgo.structure.Structure2D
count, countColumns, countRows, firstInColumn, firstInRow, getColDim, getMaxDim, getMinDim, getRowDim, isEmpty, isFat, isScalar, isSquare, isTall, isVector, limitOfColumn, limitOfRow, size
-
Field Details
-
e
private double[] e -
m
private int mCalculation row and column dimensions, possibly transposed from the input -
n
private int nCalculation row and column dimensions, possibly transposed from the input -
myPseudoinverse
-
myTransposed
private boolean myTransposed -
myUt
private double[][] myUtArrays for internal storage of U and V. -
myVt
private double[][] myVt -
s
private double[] sArray for internal storage of singular values. -
w
private double[] w
-
-
Constructor Details
-
RawSingularValue
RawSingularValue()Not recommended to use this constructor directly. Consider using the static factory methodinvalid reference
org.ojalgo.matrix.decomposition.SingularValue#make(Access2D)
-
-
Method Details
-
btran
Description copied from interface:InvertibleFactor
Backwards-transformationSolve [x]T[A] = [b]T (equivalent to [A]T[x] = [b]) by transforming [b] into [x] in-place.
- Specified by:
btran
in interfaceInvertibleFactor<Double>
- Parameters:
arg
- [b] transformed into [x]
-
computeValuesOnly
- Specified by:
computeValuesOnly
in interfaceMatrixDecomposition.Values<Double>
- Parameters:
matrix
- The matrix to decompose- Returns:
- The same as
MatrixDecomposition.Solver.compute(Collectable)
orMatrixDecomposition.decompose(Collectable)
if the instance does not implementMatrixDecomposition.Solver
.
-
countSignificant
public int countSignificant(double threshold) - Specified by:
countSignificant
in interfaceMatrixDecomposition.RankRevealing<Double>
- Parameters:
threshold
- Significance limit- Returns:
- The number of elements in the diagonal matrix that are greater than the threshold
-
decompose
- Specified by:
decompose
in interfaceMatrixDecomposition<Double>
- Parameters:
matrix
- A matrix to decompose- Returns:
- true if decomposition suceeded; false if not
-
getCondition
public double getCondition()Description copied from interface:SingularValue
The condition number.- Specified by:
getCondition
in interfaceProvider2D.Condition
- Specified by:
getCondition
in interfaceSingularValue<Double>
- Returns:
- The largest singular value divided by the smallest singular value.
-
getCovariance
- Specified by:
getCovariance
in interfaceSingularValue<Double>
- Returns:
- [[A]T[A]]-1 Where [A] is the original matrix.
-
getD
- Specified by:
getD
in interfaceSingularValue<Double>
- Returns:
- The diagonal matrix of singular values.
-
getFrobeniusNorm
public double getFrobeniusNorm()Description copied from interface:SingularValue
Sometimes also called the Schatten 2-norm or Hilbert-Schmidt norm.- Specified by:
getFrobeniusNorm
in interfaceSingularValue<Double>
- Returns:
- The square root of the sum of squares of the singular values.
-
getInverse
Description copied from interface:MatrixDecomposition.Solver
The output must be a "right inverse" and a "generalised inverse".- Specified by:
getInverse
in interfaceMatrixDecomposition.Solver<Double>
-
getInverse
Description copied from interface:MatrixDecomposition.Solver
Implementing this method is optional.
Exactly how a specific implementation makes use of
preallocated
is not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
MatrixDecomposition.Solver.getInverse()
.- Specified by:
getInverse
in interfaceMatrixDecomposition.Solver<Double>
- Parameters:
preallocated
- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/final/correct solution. UseInverterTask.preallocate(int, int)
orInverterTask.preallocate(Structure2D)
to get a suitable instance.- Returns:
- The inverse, this is where you get the solution
-
getKyFanNorm
public double getKyFanNorm(int k) Description copied from interface:SingularValue
Ky Fan k-norm.
The first Ky Fan k-norm is the operator norm (the largest singular value), and the last is called the trace norm (the sum of all singular values).
- Specified by:
getKyFanNorm
in interfaceSingularValue<Double>
- Parameters:
k
- The number of singular values to add up.- Returns:
- The sum of the k largest singular values.
-
getOperatorNorm
public double getOperatorNorm()Two norm- Specified by:
getOperatorNorm
in interfaceSingularValue<Double>
- Returns:
- max(S)
-
getRankThreshold
public double getRankThreshold()- Specified by:
getRankThreshold
in interfaceMatrixDecomposition.RankRevealing<Double>
-
getSingularValues
- Specified by:
getSingularValues
in interfaceSingularValue<Double>
- Returns:
- The singular values ordered in descending order.
-
getSingularValues
public void getSingularValues(double[] values) - Specified by:
getSingularValues
in interfaceSingularValue<Double>
- Parameters:
values
- An array that will receive the singular values
-
getSolution
public MatrixStore<Double> getSolution(Access2D.Collectable<Double, ? super PhysicalStore<Double>> rhs) Description copied from interface:MatrixDecomposition.Solver
[A][X]=[B] or [this][return]=[rhs]- Specified by:
getSolution
in interfaceMatrixDecomposition.Solver<Double>
-
getSolution
public MatrixStore<Double> getSolution(Access2D.Collectable<Double, ? super PhysicalStore<Double>> rhs, PhysicalStore<Double> preallocated) Description copied from interface:MatrixDecomposition.Solver
Implementing this method is optional.
Exactly how a specific implementation makes use of
preallocated
is not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
MatrixDecomposition.Solver.getSolution(Collectable)
.- Specified by:
getSolution
in interfaceMatrixDecomposition.Solver<Double>
- Parameters:
rhs
- The Right Hand Side, wont be modfiedpreallocated
- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/final/correct solution. UseSolverTask.preallocate(int, int, int)
orSolverTask.preallocate(Structure2D, Structure2D)
to get a suitable instance.- Returns:
- The solution
-
getTraceNorm
public double getTraceNorm()- Specified by:
getTraceNorm
in interfaceSingularValue<Double>
-
getU
Description copied from interface:SingularValue
If [A] is m-by-n and its rank is r, then:- The first r columns of [U] span the column space, range or image of [A].
- The last m-r columns of [U] span the left nullspace or cokernel of [A].
- Specified by:
getU
in interfaceSingularValue<Double>
-
getV
Description copied from interface:SingularValue
If [A] is m-by-n and its rank is r, then:- The first r columns of [V] span the row space or coimage of [A].
- The last n-r columns of [V] span the nullspace or kernel of [A].
- Specified by:
getV
in interfaceSingularValue<Double>
-
invert
public MatrixStore<Double> invert(Access2D<?> original, PhysicalStore<Double> preallocated) throws RecoverableCondition Description copied from interface:InverterTask
Exactly how (if at all) a specific implementation makes use of
preallocated
is not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
InverterTask.invert(Access2D)
.Use
InverterTask.preallocate(Structure2D)
to obtain a suitbalepreallocated
.- Specified by:
invert
in interfaceInverterTask<Double>
- Parameters:
preallocated
- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/ /correct solution.- Returns:
- The inverse
- Throws:
RecoverableCondition
- TODO
-
isFullRank
public boolean isFullRank()- Specified by:
isFullRank
in interfaceMatrixDecomposition.RankRevealing<Double>
- Returns:
- true if the rank is equal to the minimum of the row and column dimensions; false if not
-
isFullSize
public boolean isFullSize()- Specified by:
isFullSize
in interfaceMatrixDecomposition.EconomySize<Double>
- Returns:
- True if it will generate a full sized decomposition.
-
isOrdered
public boolean isOrdered()Description copied from interface:MatrixDecomposition.Ordered
This is a property of the algorithm/implementation, not the data. Typically relevant forSingularValue
,Eigenvalue
or anyMatrixDecomposition.RankRevealing
decomposition.- Specified by:
isOrdered
in interfaceMatrixDecomposition.Ordered<Double>
- Returns:
- true if the rows/columns of the returned matrix factors are guaranteed some specific order; false if there is no such guarantee.
-
isSolvable
public boolean isSolvable()Description copied from interface:MatrixDecomposition.Solver
Please note that producing a pseudoinverse and/or a least squares solution is ok! The return value, of this method, is not an indication of if the decomposed matrix is square, has full rank, is postive definite or whatever. It's that in combination with the specific decomposition algorithm's capabilities.- Specified by:
isSolvable
in interfaceMatrixDecomposition.Solver<Double>
- Overrides:
isSolvable
in classAbstractDecomposition<Double>
- Returns:
- true if this matrix decomposition is in a state to be able to deliver an inverse or an equation system solution (with some degree of numerical stability).
-
preallocate
Description copied from interface:InverterTask
Will create a PhysicalStore instance suitable for use with
InverterTask.invert(Access2D, PhysicalStore)
.When inverting a matrix (mxn) the preallocated memory/matrix will typically be nxm (and of course most of the time A is square).
- Specified by:
preallocate
in interfaceInverterTask<Double>
-
preallocate
Description copied from interface:SolverTask
Will create a PhysicalStore instance suitable for use with
SolverTask.solve(Access2D, Access2D, PhysicalStore)
. The dimensions of the returned instance is not specified by this interface - it is specified by the behaviour/requirements of each implementation.When solving an equation system [A][X]=[B] ([mxn][nxb]=[mxb]) the preallocated memory/matrix will typically be either mxb or nxb.
- Specified by:
preallocate
in interfaceSolverTask<Double>
-
reset
public void reset()Description copied from interface:MatrixDecomposition
Delete computed results, and resets attributes to default values- Specified by:
reset
in interfaceMatrixDecomposition<Double>
- Overrides:
reset
in classAbstractDecomposition<Double>
-
solve
public MatrixStore<Double> solve(Access2D<?> body, Access2D<?> rhs, PhysicalStore<Double> preallocated) throws RecoverableCondition Description copied from interface:SolverTask
Exactly how (if at all) a specific implementation makes use of
preallocated
is not specified by this interface. It must be documented for each implementation.Should produce the same results as calling
SolverTask.solve(Access2D, Access2D)
.Use
SolverTask.preallocate(Structure2D, Structure2D)
to obtain a suitbalepreallocated
.- Specified by:
solve
in interfaceSolverTask<Double>
- Parameters:
rhs
- The Right Hand Side, wont be modfiedpreallocated
- Preallocated memory for the results, possibly some intermediate results. You must assume this is modified, but you cannot assume it will contain the full/ /correct solution.- Returns:
- The solution
- Throws:
RecoverableCondition
-
checkSolvability
protected boolean checkSolvability()- Overrides:
checkSolvability
in classAbstractDecomposition<Double>
-
doDecompose
boolean doDecompose(Access2D.Collectable<Double, ? super PhysicalStore<Double>> matrix, boolean factors) -
doGetInverse
-