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