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 {