Author: erans Date: Wed Oct 30 14:16:11 2013 New Revision: 1537099 URL: http://svn.apache.org/r1537099 Log: MATH-1045 Loop added to ensure that the largest norm is used in the singularity check. Patch provided by Sean Owen.
Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/EigenDecomposition.java commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/EigenSolverTest.java Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/EigenDecomposition.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/EigenDecomposition.java?rev=1537099&r1=1537098&r2=1537099&view=diff ============================================================================== --- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/EigenDecomposition.java (original) +++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/EigenDecomposition.java Wed Oct 30 14:16:11 2013 @@ -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; Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/EigenSolverTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/EigenSolverTest.java?rev=1537099&r1=1537098&r2=1537099&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/EigenSolverTest.java (original) +++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/EigenSolverTest.java Wed Oct 30 14:16:11 2013 @@ -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() {