Author: dimpbx
Date: Sun Feb 21 21:46:12 2010
New Revision: 912413

URL: http://svn.apache.org/viewvc?rev=912413&view=rev
Log:
MATH-432 fixed

Modified:
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/EigenDecompositionImpl.java
    
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/SingularValueDecompositionImpl.java
    commons/proper/math/trunk/src/site/xdoc/changes.xml

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/EigenDecompositionImpl.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/EigenDecompositionImpl.java?rev=912413&r1=912412&r2=912413&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/EigenDecompositionImpl.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/EigenDecompositionImpl.java
 Sun Feb 21 21:46:12 2010
@@ -479,6 +479,29 @@
         }
         realEigenvalues[n - 1] = main[n - 1];
         e[n - 1] = 0.0;
+
+        // Determine the largest main and secondary value in absolute term.
+        double maxAbsoluteValue=0.0;
+        for (int i = 0; i < n; i++) {
+            if (Math.abs(realEigenvalues[i])>maxAbsoluteValue) {
+                maxAbsoluteValue=Math.abs(realEigenvalues[i]);
+            }
+            if (Math.abs(e[i])>maxAbsoluteValue) {
+                maxAbsoluteValue=Math.abs(e[i]);
+            }
+        }
+        // Make null any main and secondary value too small to be significant
+        if (maxAbsoluteValue!=0.0) {
+            for (int i=0; i < n; i++) {
+                if 
(Math.abs(realEigenvalues[i])<=MathUtils.EPSILON*maxAbsoluteValue) {
+                    realEigenvalues[i]=0.0;
+                }
+                if (Math.abs(e[i])<=MathUtils.EPSILON*maxAbsoluteValue) {
+                    e[i]=0.0;
+                }
+            }
+        }
+
         for (int j = 0; j < n; j++) {
             int its = 0;
             int m;
@@ -568,7 +591,7 @@
         }
 
         // Determine the largest eigen value in absolute term.
-        double maxAbsoluteValue=0.0;
+        maxAbsoluteValue=0.0;
         for (int i = 0; i < n; i++) {
             if (Math.abs(realEigenvalues[i])>maxAbsoluteValue) {
                 maxAbsoluteValue=Math.abs(realEigenvalues[i]);

Modified: 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/SingularValueDecompositionImpl.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/SingularValueDecompositionImpl.java?rev=912413&r1=912412&r2=912413&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/SingularValueDecompositionImpl.java
 (original)
+++ 
commons/proper/math/trunk/src/main/java/org/apache/commons/math/linear/SingularValueDecompositionImpl.java
 Sun Feb 21 21:46:12 2010
@@ -88,11 +88,12 @@
         // create A^T*A
         //
         for (int i = 0; i < n; i++) {
-            for (int j = 0; j < n; j++) {
+            for (int j = i; j < n; j++) {
                 matATA[i][j] = 0.0;
                 for (int k = 0; k < m; k++) {
                     matATA[i][j] += localcopy[k][i] * localcopy[k][j];
                 }
+                matATA[j][i]=matATA[i][j];
             }
         }
 
@@ -101,11 +102,12 @@
         // create A*A^T
         //
         for (int i = 0; i < m; i++) {
-            for (int j = 0; j < m; j++) {
+            for (int j = i; j < m; j++) {
                 matAAT[i][j] = 0.0;
                 for (int k = 0; k < n; k++) {
                     matAAT[i][j] += localcopy[i][k] * localcopy[j][k];
                 }
+                matAAT[j][i]=matAAT[i][j];
             }
         }
         int p;

Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=912413&r1=912412&r2=912413&view=diff
==============================================================================
--- commons/proper/math/trunk/src/site/xdoc/changes.xml (original)
+++ commons/proper/math/trunk/src/site/xdoc/changes.xml Sun Feb 21 21:46:12 2010
@@ -39,6 +39,12 @@
   </properties>
   <body>
     <release version="2.1" date="TBD" description="TBD">
+      <action dev="dimpbx" type="fix" issue="MATH-342">
+        In SVD, the matrices passed to EigenDecomposition are now symmetric
+        by construction (rather than simply by definition).  In 
EigenDecomposition,
+        once the tridiagonal form is obtained, the non-significant elements are
+        set to 0.
+      </action>
       <action dev="dimpbx" type="fix" issue="MATH-333">
         A EigenDecompositionImpl simplified makes it possible to compute
         the SVD of a singular matrix (with the right number of elements in


Reply via email to