Author: luc
Date: Sat May 30 18:36:18 2009
New Revision: 780308

URL: http://svn.apache.org/viewvc?rev=780308&view=rev
Log:
added conversion utility functions for
  FieldMatrix<Fraction> to RealMatrix
  FieldMatrix<BigFraction> to RealMatrix

Modified:
    
commons/proper/math/trunk/src/java/org/apache/commons/math/linear/MatrixUtils.java
    
commons/proper/math/trunk/src/test/org/apache/commons/math/linear/MatrixUtilsTest.java

Modified: 
commons/proper/math/trunk/src/java/org/apache/commons/math/linear/MatrixUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/MatrixUtils.java?rev=780308&r1=780307&r2=780308&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/java/org/apache/commons/math/linear/MatrixUtils.java
 (original)
+++ 
commons/proper/math/trunk/src/java/org/apache/commons/math/linear/MatrixUtils.java
 Sat May 30 18:36:18 2009
@@ -24,6 +24,8 @@
 import org.apache.commons.math.Field;
 import org.apache.commons.math.FieldElement;
 import org.apache.commons.math.MathRuntimeException;
+import org.apache.commons.math.fraction.BigFraction;
+import org.apache.commons.math.fraction.Fraction;
 
 /**
  * A collection of static methods that operate on or return matrices.
@@ -627,4 +629,92 @@
         }
     }
 
+    /**
+     * Convert a {...@link FieldMatrix}/{...@link Fraction} matrix to a 
{...@link RealMatrix}.
+     * @param m matrix to convert
+     * @return converted matrix
+     */
+    public static RealMatrix fractionMatrixToRealMatrix(final 
FieldMatrix<Fraction> m) {
+        final FractionMatrixConverter converter = new 
FractionMatrixConverter();
+        m.walkInOptimizedOrder(converter);
+        return converter.getConvertedMatrix();
+    }
+
+    /** Converter for {...@link FieldMatrix}/{...@link Fraction}. */
+    private static class FractionMatrixConverter extends 
DefaultFieldMatrixPreservingVisitor<Fraction> {
+
+        /** Converted array. */
+        private double[][] data;
+
+        /** Simple constructor. */
+        public FractionMatrixConverter() {
+            super(Fraction.ZERO);
+        }
+
+        /** {...@inheritdoc} */
+        @Override
+        public void start(int rows, int columns,
+                          int startRow, int endRow, int startColumn, int 
endColumn) {
+            data = new double[rows][columns];
+        }
+
+        /** {...@inheritdoc} */
+        @Override
+        public void visit(int row, int column, Fraction value) {
+            data[row][column] = value.doubleValue();
+        }
+
+        /** Get the converted matrix.
+         * @return converted matrix
+         */
+        RealMatrix getConvertedMatrix() {
+            return new RealMatrixImpl(data, false);
+        }
+
+    }
+
+    /**
+     * Convert a {...@link FieldMatrix}/{...@link BigFraction} matrix to a 
{...@link RealMatrix}.
+     * @param m matrix to convert
+     * @return converted matrix
+     */
+    public static RealMatrix bigFractionMatrixToRealMatrix(final 
FieldMatrix<BigFraction> m) {
+        final BigFractionMatrixConverter converter = new 
BigFractionMatrixConverter();
+        m.walkInOptimizedOrder(converter);
+        return converter.getConvertedMatrix();
+    }
+
+    /** Converter for {...@link FieldMatrix}/{...@link BigFraction}. */
+    private static class BigFractionMatrixConverter extends 
DefaultFieldMatrixPreservingVisitor<BigFraction> {
+
+        /** Converted array. */
+        private double[][] data;
+
+        /** Simple constructor. */
+        public BigFractionMatrixConverter() {
+            super(BigFraction.ZERO);
+        }
+
+        /** {...@inheritdoc} */
+        @Override
+        public void start(int rows, int columns,
+                          int startRow, int endRow, int startColumn, int 
endColumn) {
+            data = new double[rows][columns];
+        }
+
+        /** {...@inheritdoc} */
+        @Override
+        public void visit(int row, int column, BigFraction value) {
+            data[row][column] = value.doubleValue();
+        }
+
+        /** Get the converted matrix.
+         * @return converted matrix
+         */
+        RealMatrix getConvertedMatrix() {
+            return new RealMatrixImpl(data, false);
+        }
+
+    }
+
 }

Modified: 
commons/proper/math/trunk/src/test/org/apache/commons/math/linear/MatrixUtilsTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/MatrixUtilsTest.java?rev=780308&r1=780307&r2=780308&view=diff
==============================================================================
--- 
commons/proper/math/trunk/src/test/org/apache/commons/math/linear/MatrixUtilsTest.java
 (original)
+++ 
commons/proper/math/trunk/src/test/org/apache/commons/math/linear/MatrixUtilsTest.java
 Sat May 30 18:36:18 2009
@@ -21,6 +21,7 @@
 import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
+import org.apache.commons.math.fraction.BigFraction;
 import org.apache.commons.math.fraction.Fraction;
 import org.apache.commons.math.fraction.FractionConversionException;
 import org.apache.commons.math.fraction.FractionField;
@@ -322,6 +323,30 @@
         }
     }
 
+    public void testBigFractionConverter() {
+        BigFraction[][] bfData = {
+                { new BigFraction(1), new BigFraction(2), new BigFraction(3) },
+                { new BigFraction(2), new BigFraction(5), new BigFraction(3) },
+                { new BigFraction(1), new BigFraction(0), new BigFraction(8) }
+        };
+        FieldMatrix<BigFraction> m = new FieldMatrixImpl<BigFraction>(bfData, 
false);
+        RealMatrix converted = MatrixUtils.bigFractionMatrixToRealMatrix(m);
+        RealMatrix reference = new RealMatrixImpl(testData, false);
+        assertEquals(0.0, converted.subtract(reference).getNorm(), 0.0);
+    }
+
+    public void testFractionConverter() {
+        Fraction[][] fData = {
+                { new Fraction(1), new Fraction(2), new Fraction(3) },
+                { new Fraction(2), new Fraction(5), new Fraction(3) },
+                { new Fraction(1), new Fraction(0), new Fraction(8) }
+        };
+        FieldMatrix<Fraction> m = new FieldMatrixImpl<Fraction>(fData, false);
+        RealMatrix converted = MatrixUtils.fractionMatrixToRealMatrix(m);
+        RealMatrix reference = new RealMatrixImpl(testData, false);
+        assertEquals(0.0, converted.subtract(reference).getNorm(), 0.0);
+    }
+
     public static final Fraction[][] asFraction(double[][] data) {
         Fraction d[][] = new Fraction[data.length][];
         try {


Reply via email to