You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by er...@apache.org on 2013/10/30 15:16:11 UTC

svn commit: r1537099 - in /commons/proper/math/trunk/src: main/java/org/apache/commons/math3/linear/EigenDecomposition.java test/java/org/apache/commons/math3/linear/EigenSolverTest.java

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() {