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:
Luc Maisonobe 2014-02-23 11:10:41 +00:00
parent 927361d787
commit f299ecf330
5 changed files with 38 additions and 4 deletions

View File

@ -51,6 +51,9 @@ If the output is not quite correct, check for invisible trailing spaces!
</properties> </properties>
<body> <body>
<release version="3.3" date="TBD" description="TBD"> <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"> <action dev="luc" type="add" issue="MATH-1053" due-to="Sean Owen">
QR decomposition can compute pseudo-inverses for tall matrices. QR decomposition can compute pseudo-inverses for tall matrices.
</action> </action>

View File

@ -291,6 +291,14 @@ public class QRDecomposition {
/** /**
* Get a solver for finding the A &times; X = B solution in least square sense. * Get a solver for finding the A &times; 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 * @return a solver
*/ */
public DecompositionSolver getSolver() { public DecompositionSolver getSolver() {

View File

@ -184,6 +184,14 @@ public class RRQRDecomposition extends QRDecomposition {
/** /**
* Get a solver for finding the A &times; X = B solution in least square sense. * Get a solver for finding the A &times; 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 * @return a solver
*/ */
@Override @Override

View File

@ -144,10 +144,16 @@ RealVector solution = solver.solve(constants);
Each type of decomposition has its specific semantics and constraints on Each type of decomposition has its specific semantics and constraints on
the coefficient matrix as shown in the following table. For algorithms that 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 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 residual AX-B has minimal norm. Least Square sense means a solver can be computed
X the residual AX-B is exactly 0), then this exact solution is also the solution for an overdetermined system, (i.e. a system with more equations than unknowns,
in least square sense. This implies that algorithms suited for least squares which corresponds to a tall A matrix with more rows than columns). If an exact
problems can also be used to solve exact problems, but the reverse is not true. 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>
<p> <p>
<table border="1" align="center"> <table border="1" align="center">

View File

@ -273,5 +273,14 @@ public class QRDecompositionTest {
}); });
return m; 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);
}
} }