Improved documentation of QR decomposition handling of singular matrix.
JIRA: MATH-1101 git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1570994 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
927361d787
commit
f299ecf330
|
@ -51,6 +51,9 @@ If the output is not quite correct, check for invisible trailing spaces!
|
|||
</properties>
|
||||
<body>
|
||||
<release version="3.3" date="TBD" description="TBD">
|
||||
<action dev="luc" type="add" issue="MATH-1101">
|
||||
Improved documentation of QR decomposition handling of singular matrices.
|
||||
</action>
|
||||
<action dev="luc" type="add" issue="MATH-1053" due-to="Sean Owen">
|
||||
QR decomposition can compute pseudo-inverses for tall matrices.
|
||||
</action>
|
||||
|
|
|
@ -291,6 +291,14 @@ public class QRDecomposition {
|
|||
|
||||
/**
|
||||
* Get a solver for finding the A × X = B solution in least square sense.
|
||||
* <p>
|
||||
* Least Square sense means a solver can be computed for an overdetermined system,
|
||||
* (i.e. a system with more equations than unknowns, which corresponds to a tall A
|
||||
* matrix with more rows than columns). In any case, if the matrix is singular
|
||||
* within the tolerance set at {@link QRDecomposition#QRDecomposition(RealMatrix,
|
||||
* double) construction}, an error will be triggered when
|
||||
* the {@link DecompositionSolver#solve(RealVector) solve} method will be called.
|
||||
* </p>
|
||||
* @return a solver
|
||||
*/
|
||||
public DecompositionSolver getSolver() {
|
||||
|
|
|
@ -184,6 +184,14 @@ public class RRQRDecomposition extends QRDecomposition {
|
|||
|
||||
/**
|
||||
* Get a solver for finding the A × X = B solution in least square sense.
|
||||
* <p>
|
||||
* Least Square sense means a solver can be computed for an overdetermined system,
|
||||
* (i.e. a system with more equations than unknowns, which corresponds to a tall A
|
||||
* matrix with more rows than columns). In any case, if the matrix is singular
|
||||
* within the tolerance set at {@link RRQRDecomposition#RRQRDecomposition(RealMatrix,
|
||||
* double) construction}, an error will be triggered when
|
||||
* the {@link DecompositionSolver#solve(RealVector) solve} method will be called.
|
||||
* </p>
|
||||
* @return a solver
|
||||
*/
|
||||
@Override
|
||||
|
|
|
@ -144,10 +144,16 @@ RealVector solution = solver.solve(constants);
|
|||
Each type of decomposition has its specific semantics and constraints on
|
||||
the coefficient matrix as shown in the following table. For algorithms that
|
||||
solve AX=B in least squares sense the value returned for X is such that the
|
||||
residual AX-B has minimal norm. If an exact solution exist (i.e. if for some
|
||||
X the residual AX-B is exactly 0), then this exact solution is also the solution
|
||||
in least square sense. This implies that algorithms suited for least squares
|
||||
problems can also be used to solve exact problems, but the reverse is not true.
|
||||
residual AX-B has minimal norm. Least Square sense means a solver can be computed
|
||||
for an overdetermined system, (i.e. a system with more equations than unknowns,
|
||||
which corresponds to a tall A matrix with more rows than columns). If an exact
|
||||
solution exist (i.e. if for some X the residual AX-B is exactly 0), then this
|
||||
exact solution is also the solution in least square sense. This implies that
|
||||
algorithms suited for least squares problems can also be used to solve exact
|
||||
problems, but the reverse is not true. In any case, if the matrix is singular
|
||||
within the tolerance set at construction, an error will be triggered when
|
||||
the solve method will be called, both for algorithms that compute exact solutions
|
||||
and for algorithms that compute least square solutions.
|
||||
</p>
|
||||
<p>
|
||||
<table border="1" align="center">
|
||||
|
|
|
@ -274,4 +274,13 @@ public class QRDecompositionTest {
|
|||
return m;
|
||||
}
|
||||
|
||||
@Test(expected=SingularMatrixException.class)
|
||||
public void testQRSingular() {
|
||||
final RealMatrix a = MatrixUtils.createRealMatrix(new double[][] {
|
||||
{ 1, 6, 4 }, { 2, 4, -1 }, { -1, 2, 5 }
|
||||
});
|
||||
final RealVector b = new ArrayRealVector(new double[]{ 5, 6, 1 });
|
||||
new QRDecomposition(a, 1.0e-15).getSolver().solve(b);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue