You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by lu...@apache.org on 2014/02/21 14:18:35 UTC

svn commit: r1570566 - in /commons/proper/math/trunk/src: changes/changes.xml main/java/org/apache/commons/math3/linear/QRDecomposition.java test/java/org/apache/commons/math3/linear/QRDecompositionTest.java

Author: luc
Date: Fri Feb 21 13:18:35 2014
New Revision: 1570566

URL: http://svn.apache.org/r1570566
Log:
QR decomposition can compute pseudo-inverses for tall matrices.

Thanks to Sean Owen for the patch.

JIRA: MATH-1053

Modified:
    commons/proper/math/trunk/src/changes/changes.xml
    commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/QRDecomposition.java
    commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/QRDecompositionTest.java

Modified: commons/proper/math/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/changes/changes.xml?rev=1570566&r1=1570565&r2=1570566&view=diff
==============================================================================
--- commons/proper/math/trunk/src/changes/changes.xml (original)
+++ commons/proper/math/trunk/src/changes/changes.xml Fri Feb 21 13:18:35 2014
@@ -51,6 +51,9 @@ If the output is not quite correct, chec
   </properties>
   <body>
     <release version="3.3" date="TBD" description="TBD">
+      <action dev="luc" type="add" issue="MATH-1053" due-to="Sean Owen">
+        QR decomposition can compute pseudo-inverses for tall matrices.
+      </action>
       <action dev="luc" type="add" issue="MATH-820">
         Field vectors now implement the visitor pattern just like real vectors.
       </action>

Modified: commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/QRDecomposition.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/QRDecomposition.java?rev=1570566&r1=1570565&r2=1570566&view=diff
==============================================================================
--- commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/QRDecomposition.java (original)
+++ commons/proper/math/trunk/src/main/java/org/apache/commons/math3/linear/QRDecomposition.java Fri Feb 21 13:18:35 2014
@@ -463,7 +463,7 @@ public class QRDecomposition {
          * @throws SingularMatrixException if the decomposed matrix is singular.
          */
         public RealMatrix getInverse() {
-            return solve(MatrixUtils.createRealIdentityMatrix(rDiag.length));
+            return solve(MatrixUtils.createRealIdentityMatrix(qrt[0].length));
         }
     }
 }

Modified: commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/QRDecompositionTest.java
URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/QRDecompositionTest.java?rev=1570566&r1=1570565&r2=1570566&view=diff
==============================================================================
--- commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/QRDecompositionTest.java (original)
+++ commons/proper/math/trunk/src/test/java/org/apache/commons/math3/linear/QRDecompositionTest.java Fri Feb 21 13:18:35 2014
@@ -248,6 +248,21 @@ public class QRDecompositionTest {
         qr.getSolver().getInverse();
     }
 
+    @Test
+    public void testInvertTallSkinny() {
+        RealMatrix a     = MatrixUtils.createRealMatrix(testData4x3);
+        RealMatrix pinv  = new QRDecomposition(a).getSolver().getInverse();
+        Assert.assertEquals(0, pinv.multiply(a).subtract(MatrixUtils.createRealIdentityMatrix(3)).getNorm(), 1.0e-6);
+    }
+
+    @Test
+    public void testInvertShortWide() {
+        RealMatrix a = MatrixUtils.createRealMatrix(testData3x4);
+        RealMatrix pinv  = new QRDecomposition(a).getSolver().getInverse();
+        Assert.assertEquals(0, a.multiply(pinv).subtract(MatrixUtils.createRealIdentityMatrix(3)).getNorm(), 1.0e-6);
+        Assert.assertEquals(0, pinv.multiply(a).getSubMatrix(0, 2, 0, 2).subtract(MatrixUtils.createRealIdentityMatrix(3)).getNorm(), 1.0e-6);
+    }
+
     private RealMatrix createTestMatrix(final Random r, final int rows, final int columns) {
         RealMatrix m = MatrixUtils.createRealMatrix(rows, columns);
         m.walkInOptimizedOrder(new DefaultRealMatrixChangingVisitor(){