MATH-1045

Loop added to ensure that the largest norm is used in the singularity
check. Patch provided by Sean Owen.


git-svn-id: https://svn.apache.org/repos/asf/commons/proper/math/trunk@1537099 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Gilles Sadowski 2013-10-30 14:16:11 +00:00
parent 5526877f31
commit c979a6f0fe
2 changed files with 17 additions and 2 deletions

View File

@ -513,8 +513,12 @@ public class EigenDecomposition {
* @return true if the decomposed matrix is non-singular.
*/
public boolean isNonSingular() {
// The eigenvalues are sorted by size, descending
double largestEigenvalueNorm = eigenvalueNorm(0);
double largestEigenvalueNorm = 0.0;
// Looping over all values (in case they are not sorted in decreasing
// order of their norm).
for (int i = 0; i < realEigenvalues.length; ++i) {
largestEigenvalueNorm = FastMath.max(largestEigenvalueNorm, eigenvalueNorm(i));
}
// Corner case: zero matrix, all exactly 0 eigenvalues
if (largestEigenvalueNorm == 0.0) {
return false;

View File

@ -107,6 +107,17 @@ public class EigenSolverTest {
eigen.getSolver().getInverse();
}
@Test
public void testIsNonSingularTinyOutOfOrderEigenvalue() {
final EigenDecomposition eigen
= new EigenDecomposition(MatrixUtils.createRealMatrix(new double[][] {
{ 1e-13, 0 },
{ 1, 1 },
}));
Assert.assertFalse("Singular matrix not detected",
eigen.getSolver().isNonSingular());
}
/** test solve dimension errors */
@Test
public void testSolveDimensionErrors() {