psteitz 2004/07/10 21:49:24 Modified: math/src/java/org/apache/commons/math/linear BigMatrix.java BigMatrixImpl.java math/src/test/org/apache/commons/math/linear BigMatrixImplTest.java Log: Added methods allowing exact values to be set using string representations. Revision Changes Path 1.4 +32 -4 jakarta-commons/math/src/java/org/apache/commons/math/linear/BigMatrix.java Index: BigMatrix.java =================================================================== RCS file: /home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/linear/BigMatrix.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- BigMatrix.java 23 Jun 2004 16:26:17 -0000 1.3 +++ BigMatrix.java 11 Jul 2004 04:49:24 -0000 1.4 @@ -115,6 +115,17 @@ * @param data 2-dimensional array of entries */ void setData(double[][] data); + + /** + * Overwrites the underlying data for the matrix with + * <code>BigDecimal</code> entries with values represented by the strings + * in <code>data</code>. + * + * @param data 2-dimensional array of entries + * @throws NumberFormatException if any of the entries in <code>data</code> + * are not valid representations of <code>BigDecimal</code> values + */ + void setData(String[][] data); /*** * Sets the rounding mode to use when dividing values @@ -224,6 +235,21 @@ */ void setEntry(int row, int column, double value) throws MatrixIndexException; + + /** + * Sets the entry in the specified row and column to the + * <code>BigDecimal</code> value represented by the input string. + * + * @param row row location of entry to be set + * @param column column location of entry to be set + * @param value value to set + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified coordinate is outside the dimensions of this matrix + * @throws NumberFormatException if <code>value</code> is not a valid + * representation of a <code>BigDecimal</code> value + */ + void setEntry(int row, int column, String value) + throws MatrixIndexException; /** * Returns the transpose of this matrix. @@ -236,7 +262,8 @@ * Returns the inverse of this matrix. * * @return inverse matrix - * @throws org.apache.commons.math.linear.InvalidMatrixException if this is not invertible + * @throws org.apache.commons.math.linear.InvalidMatrixException if + * this is not invertible */ BigMatrix inverse() throws InvalidMatrixException; @@ -244,9 +271,10 @@ * Returns the determinant of this matrix. * * @return determinant - [EMAIL PROTECTED] InvalidMatrixException if matrix is not square + [EMAIL PROTECTED] org.apache.commons.math.linear.InvalidMatrixException if + * matrix is not square */ - BigDecimal getDeterminant(); + BigDecimal getDeterminant() throws InvalidMatrixException; /** * Is this a square matrix? 1.3 +71 -12 jakarta-commons/math/src/java/org/apache/commons/math/linear/BigMatrixImpl.java Index: BigMatrixImpl.java =================================================================== RCS file: /home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/linear/BigMatrixImpl.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- BigMatrixImpl.java 23 Jun 2004 16:26:17 -0000 1.2 +++ BigMatrixImpl.java 11 Jul 2004 04:49:24 -0000 1.3 @@ -119,6 +119,17 @@ } /** + * Create a new BigMatrix using the values represented by the strings in + * <code>data</code> as the underlying data array. + * + * @param d data for new matrix + */ + public BigMatrixImpl(String[][] d) { + this.copyIn(d); + lu = null; + } + + /** * Create a new (column) BigMatrix using <code>v</code> as the * data for the unique column of the <code>v.length x 1</code> matrix * created. @@ -321,6 +332,20 @@ } /** + * Overwrites the underlying data for the matrix with + * <code>BigDecimal</code> entries with values represented by the strings + * in <code>data</code>. + * + * @param data 2-dimensional array of entries + * @throws NumberFormatException if any of the entries in <code>data</code> + * are not valid representations of <code>BigDecimal</code> values + */ + public void setData(String[][] data) { + copyIn(data); + lu = null; + } + + /** * Returns a reference to the underlying data array. * <p> * Does not make a fresh copy of the underlying data. @@ -346,7 +371,7 @@ /*** * Gets the rounding mode for division operations - * The default is [EMAIL PROTECTED] BigDecimal#ROUND_HALF_UP} + * The default is [EMAIL PROTECTED] java.math.BigDecimal#ROUND_HALF_UP} * @see BigDecimal * @return the rounding mode. */ @@ -424,8 +449,8 @@ * * @param row the row to be fetched * @return array of entries in the row - * @throws org.apache.commons.math.linear.MatrixIndexException if the specified row is greater - * than the number of rows in this matrix + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified row is greater than the number of rows in this matrix */ public double[] getRowAsDoubleArray(int row) throws MatrixIndexException { if ( !isValidCoordinate( row, 1 ) ) { @@ -444,8 +469,8 @@ * * @param col column to fetch * @return array of entries in the column - * @throws MatrixIndexException if the specified column is greater - * than the number of columns in this matrix + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified column is greater than the number of columns in this matrix */ public BigDecimal[] getColumn(int col) throws MatrixIndexException { if ( !isValidCoordinate(1, col) ) { @@ -465,8 +490,8 @@ * * @param col column to fetch * @return array of entries in the column - * @throws org.apache.commons.math.linear.MatrixIndexException if the specified column is greater - * than the number of columns in this matrix + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified column is greater than the number of columns in this matrix */ public double[] getColumnAsDoubleArray(int col) throws MatrixIndexException { if ( !isValidCoordinate( 1, col ) ) { @@ -503,8 +528,8 @@ * @param row row location of entry to be fetched * @param column column location of entry to be fetched * @return matrix entry in row,column - * @throws org.apache.commons.math.linear.MatrixIndexException if the specified coordinate is outside - * the dimensions of this matrix + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified coordinate is outside the dimensions of this matrix */ public double getEntryAsDouble(int row, int column) throws MatrixIndexException { return getEntry(row,column).doubleValue(); @@ -534,14 +559,30 @@ * @param row row location of entry to be set * @param column column location of entry to be set * @param value value to set - * @throws org.apache.commons.math.linear.MatrixIndexException if the specified coordinate is outside - * he dimensions of this matrix + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified coordinate is outside the dimensions of this matrix */ public void setEntry(int row, int column, double value) throws MatrixIndexException { setEntry(row, column, new BigDecimal(value)); } /** + * Sets the entry in the specified row and column to the + * <code>BigDecimal</code> value represented by the input string. + * + * @param row row location of entry to be set + * @param column column location of entry to be set + * @param value value to set + * @throws org.apache.commons.math.linear.MatrixIndexException if the + * specified coordinate is outside the dimensions of this matrix + * @throws NumberFormatException if <code>value</code> is not a valid + * representation of a <code>BigDecimal</code> value + */ + public void setEntry(int row, int column, String value) throws MatrixIndexException { + setEntry(row, column, new BigDecimal(value)); + } + + /** * Returns the transpose matrix. * * @return transpose matrix @@ -1046,6 +1087,24 @@ * @param in data to copy in */ private void copyIn(double[][] in) { + int nRows = in.length; + int nCols = in[0].length; + data = new BigDecimal[nRows][nCols]; + for (int i = 0; i < nRows; i++) { + for (int j=0; j < nCols; j++) { + data[i][j] = new BigDecimal(in[i][j]); + } + } + lu = null; + } + + /** + * Replaces data with BigDecimals represented by the strings in the input + * array. + * + * @param in data to copy in + */ + private void copyIn(String[][] in) { int nRows = in.length; int nCols = in[0].length; data = new BigDecimal[nRows][nCols]; 1.2 +29 -2 jakarta-commons/math/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java Index: BigMatrixImplTest.java =================================================================== RCS file: /home/cvs/jakarta-commons/math/src/test/org/apache/commons/math/linear/BigMatrixImplTest.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- BigMatrixImplTest.java 6 Jun 2004 04:20:45 -0000 1.1 +++ BigMatrixImplTest.java 11 Jul 2004 04:49:24 -0000 1.2 @@ -30,6 +30,7 @@ public final class BigMatrixImplTest extends TestCase {
private double[][] testData = { {1d,2d,3d}, {2d,5d,3d}, {1d,0d,8d} }; + private String[][] testDataString = { {"1","2","3"}, {"2","5","3"}, {"1","0","8"} }; private double[][] testDataLU = {{2d, 5d, 3d}, {.5d, -2.5d, 6.5d}, {0.5d, 0.2d, .2d}}; private double[][] testDataPlus2 = { {3d,4d,5d}, {4d,7d,5d}, {3d,2d,10d} }; private double[][] testDataMinus = { {-1d,-2d,-3d}, {-2d,-5d,-3d}, @@ -134,7 +135,23 @@ m3.setDataRef(asBigDecimal(stompMe)); assertClose("no copy side effect",m,new BigMatrixImpl(testData), entryTolerance); - } + } + + /** test constructors */ + public void testConstructors() { + BigMatrix m1 = new BigMatrixImpl(testData); + BigMatrix m2 = new BigMatrixImpl(testDataString); + BigMatrix m3 = new BigMatrixImpl(asBigDecimal(testData)); + assertClose("double, string", m1, m2, Double.MIN_VALUE); + assertClose("double, BigDecimal", m1, m3, Double.MIN_VALUE); + assertClose("string, BigDecimal", m2, m3, Double.MIN_VALUE); + try { + BigMatrix m4 = new BigMatrixImpl(new String[][] {{"0", "hello", "1"}}); + fail("Expecting NumberFormatException"); + } catch (NumberFormatException ex) { + // expected + } + } /** test add */ public void testAdd() { @@ -441,6 +458,16 @@ } catch (MatrixIndexException ex) { ; } + m.setEntry(1, 2, "0.1"); + m.setEntry(1, 1, 0.1d); + assertFalse(m.getEntry(1, 2).equals(m.getEntry(1, 1))); + assertTrue(m.getEntry(1, 2).equals(new BigDecimal("0.1"))); + try { + m.setEntry(1, 2, "not a number"); + fail("Expecting NumberFormatException"); + } catch (NumberFormatException ex) { + ; + } } public void testLUDecomposition() throws Exception { --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]