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