Author: luc Date: Sun Dec 7 08:53:05 2008 New Revision: 724158 URL: http://svn.apache.org/viewvc?rev=724158&view=rev Log: added setter methods for rows and columns in matrices JIRA: MATH-234
Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/MessagesResources_fr.java commons/proper/math/trunk/src/java/org/apache/commons/math/linear/AbstractRealMatrix.java commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java commons/proper/math/trunk/src/site/xdoc/changes.xml commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/MessagesResources_fr.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/MessagesResources_fr.java?rev=724158&r1=724157&r2=724158&view=diff ============================================================================== --- commons/proper/math/trunk/src/java/org/apache/commons/math/MessagesResources_fr.java (original) +++ commons/proper/math/trunk/src/java/org/apache/commons/math/MessagesResources_fr.java Sun Dec 7 08:53:05 2008 @@ -194,6 +194,8 @@ "nombre de colonnes invalide : {0} (doit \u00eatre positif)" }, { "vector length mismatch: got {0} but expected {1}", "taille de vecteur invalide : {0} au lieu de {1} attendue" }, + { "dimensions mismatch: got {0}x{1} but expected {2}x{3}", + "dimensions incoh\u00e9rentes : {0}x{1} \u00e0 la place de {2}x{3}" }, // org.apache.commons.math.linear.BigMatrixImpl // org.apache.commons.math.linear.RealMatrixImpl Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/linear/AbstractRealMatrix.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/AbstractRealMatrix.java?rev=724158&r1=724157&r2=724158&view=diff ============================================================================== --- commons/proper/math/trunk/src/java/org/apache/commons/math/linear/AbstractRealMatrix.java (original) +++ commons/proper/math/trunk/src/java/org/apache/commons/math/linear/AbstractRealMatrix.java Sun Dec 7 08:53:05 2008 @@ -346,6 +346,27 @@ } /** [EMAIL PROTECTED] */ + public void setRowMatrix(final int row, final RealMatrix matrix) + throws MatrixIndexException, InvalidMatrixException { + + checkRowIndex(row); + final int nCols = getColumnDimension(); + if ((matrix.getRowDimension() != 1) || + (matrix.getColumnDimension() != nCols)) { + throw new InvalidMatrixException("dimensions mismatch: got {0}x{1} but expected {2}x{3}", + new Object[] { + matrix.getRowDimension(), + matrix.getColumnDimension(), + 1, nCols + }); + } + for (int i = 0; i < nCols; ++i) { + setEntry(row, i, matrix.getEntry(0, i)); + } + + } + + /** [EMAIL PROTECTED] */ public RealMatrix getColumnMatrix(final int column) throws MatrixIndexException { @@ -361,11 +382,26 @@ } /** [EMAIL PROTECTED] */ - public RealVector getColumnVector(final int column) - throws MatrixIndexException { - return new RealVectorImpl(getColumn(column), false); - } + public void setColumnMatrix(final int column, final RealMatrix matrix) + throws MatrixIndexException, InvalidMatrixException { + + checkColumnIndex(column); + final int nRows = getRowDimension(); + if ((matrix.getRowDimension() != nRows) || + (matrix.getColumnDimension() != 1)) { + throw new InvalidMatrixException("dimensions mismatch: got {0}x{1} but expected {2}x{3}", + new Object[] { + matrix.getRowDimension(), + matrix.getColumnDimension(), + nRows, 1 + }); + } + for (int i = 0; i < nRows; ++i) { + setEntry(i, column, matrix.getEntry(i, 0)); + } + } + /** [EMAIL PROTECTED] */ public RealVector getRowVector(final int row) throws MatrixIndexException { @@ -373,6 +409,50 @@ } /** [EMAIL PROTECTED] */ + public void setRowVector(final int row, final RealVector vector) + throws MatrixIndexException, InvalidMatrixException { + + checkRowIndex(row); + final int nCols = getColumnDimension(); + if (vector.getDimension() != nCols) { + throw new InvalidMatrixException("dimensions mismatch: got {0}x{1} but expected {2}x{3}", + new Object[] { + 1, vector.getDimension(), + 1, nCols + }); + } + for (int i = 0; i < nCols; ++i) { + setEntry(row, i, vector.getEntry(i)); + } + + } + + /** [EMAIL PROTECTED] */ + public RealVector getColumnVector(final int column) + throws MatrixIndexException { + return new RealVectorImpl(getColumn(column), false); + } + + /** [EMAIL PROTECTED] */ + public void setColumnVector(final int column, final RealVector vector) + throws MatrixIndexException, InvalidMatrixException { + + checkColumnIndex(column); + final int nRows = getRowDimension(); + if (vector.getDimension() != nRows) { + throw new InvalidMatrixException("dimensions mismatch: got {0}x{1} but expected {2}x{3}", + new Object[] { + vector.getDimension(), 1, + nRows, 1 + }); + } + for (int i = 0; i < nRows; ++i) { + setEntry(i, column, vector.getEntry(i)); + } + + } + + /** [EMAIL PROTECTED] */ public double[] getRow(final int row) throws MatrixIndexException { @@ -388,6 +468,25 @@ } /** [EMAIL PROTECTED] */ + public void setRow(final int row, final double[] array) + throws MatrixIndexException, InvalidMatrixException { + + checkRowIndex(row); + final int nCols = getColumnDimension(); + if (array.length != nCols) { + throw new InvalidMatrixException("dimensions mismatch: got {0}x{1} but expected {2}x{3}", + new Object[] { + 1, array.length, + 1, nCols + }); + } + for (int i = 0; i < nCols; ++i) { + setEntry(row, i, array[i]); + } + + } + + /** [EMAIL PROTECTED] */ public double[] getColumn(final int column) throws MatrixIndexException { @@ -403,6 +502,25 @@ } /** [EMAIL PROTECTED] */ + public void setColumn(final int column, final double[] array) + throws MatrixIndexException, InvalidMatrixException { + + checkColumnIndex(column); + final int nRows = getRowDimension(); + if (array.length != nRows) { + throw new InvalidMatrixException("dimensions mismatch: got {0}x{1} but expected {2}x{3}", + new Object[] { + array.length, 1, + nRows, 1 + }); + } + for (int i = 0; i < nRows; ++i) { + setEntry(i, column, array[i]); + } + + } + + /** [EMAIL PROTECTED] */ public abstract double getEntry(int row, int column) throws MatrixIndexException; Modified: commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java?rev=724158&r1=724157&r2=724158&view=diff ============================================================================== --- commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java (original) +++ commons/proper/math/trunk/src/java/org/apache/commons/math/linear/RealMatrix.java Sun Dec 7 08:53:05 2008 @@ -190,6 +190,20 @@ RealMatrix getRowMatrix(int row) throws MatrixIndexException; /** + * Sets the entries in row number <code>row</code> + * as a row matrix. Row indices start at 0. + * + * @param row the row to be set + * @param matrix row matrix (must have one row and the same number of columns + * as the instance) + * @throws MatrixIndexException if the specified row index is invalid + * @throws InvalidMatrixException if the matrix dimensions do not match one + * instance row + */ + void setRowMatrix(int row, RealMatrix matrix) + throws MatrixIndexException, InvalidMatrixException; + + /** * Returns the entries in column number <code>column</code> * as a column matrix. Column indices start at 0. * @@ -200,6 +214,20 @@ RealMatrix getColumnMatrix(int column) throws MatrixIndexException; /** + * Sets the entries in column number <code>column</code> + * as a column matrix. Column indices start at 0. + * + * @param column the column to be set + * @param matrix column matrix (must have one column and the same number of rows + * as the instance) + * @throws MatrixIndexException if the specified column index is invalid + * @throws InvalidMatrixException if the matrix dimensions do not match one + * instance column + */ + void setColumnMatrix(int column, RealMatrix matrix) + throws MatrixIndexException, InvalidMatrixException; + + /** * Returns the entries in row number <code>row</code> * as a vector. Row indices start at 0. * @@ -208,6 +236,20 @@ * @throws MatrixIndexException if the specified row index is invalid */ RealVector getRowVector(int row) throws MatrixIndexException; + + /** + * Sets the entries in row number <code>row</code> + * as a row matrix. Row indices start at 0. + * + * @param row the row to be set + * @param vector row vector (must have the same number of columns + * as the instance) + * @throws MatrixIndexException if the specified row index is invalid + * @throws InvalidMatrixException if the vector dimension does not match one + * instance row + */ + void setRowVector(int row, RealVector vector) + throws MatrixIndexException, InvalidMatrixException; /** * Returns the entries in column number <code>column</code> @@ -218,7 +260,20 @@ * @throws MatrixIndexException if the specified column index is invalid */ RealVector getColumnVector(int column) throws MatrixIndexException; - + + /** + * Sets the entries in column number <code>column</code> + * as a column matrix. Column indices start at 0. + * + * @param column the column to be set + * @param vector column vector (must have the same number of rows as the instance) + * @throws MatrixIndexException if the specified column index is invalid + * @throws InvalidMatrixException if the vector dimension does not match one + * instance column + */ + void setColumnVector(int column, RealVector vector) + throws MatrixIndexException, InvalidMatrixException; + /** * Returns the entries in row number <code>row</code> as an array. * <p> @@ -232,6 +287,19 @@ double[] getRow(int row) throws MatrixIndexException; /** + * Sets the entries in row number <code>row</code> + * as a row matrix. Row indices start at 0. + * + * @param row the row to be set + * @param array row matrix (must have the same number of columns as the instance) + * @throws MatrixIndexException if the specified row index is invalid + * @throws InvalidMatrixException if the array size does not match one + * instance row + */ + void setRow(int row, double[] array) + throws MatrixIndexException, InvalidMatrixException; + + /** * Returns the entries in column number <code>col</code> as an array. * <p> * Column indices start at 0. A <code>MatrixIndexException</code> is thrown @@ -244,6 +312,19 @@ double[] getColumn(int column) throws MatrixIndexException; /** + * Sets the entries in column number <code>column</code> + * as a column matrix. Column indices start at 0. + * + * @param column the column to be set + * @param array column array (must have the same number of rows as the instance) + * @throws MatrixIndexException if the specified column index is invalid + * @throws InvalidMatrixException if the array size does not match one + * instance column + */ + void setColumn(int column, double[] array) + throws MatrixIndexException, InvalidMatrixException; + + /** * Returns the entry in the specified row and column. * <p> * Row and column indices start at 0 and must satisfy Modified: commons/proper/math/trunk/src/site/xdoc/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/site/xdoc/changes.xml?rev=724158&r1=724157&r2=724158&view=diff ============================================================================== --- commons/proper/math/trunk/src/site/xdoc/changes.xml (original) +++ commons/proper/math/trunk/src/site/xdoc/changes.xml Sun Dec 7 08:53:05 2008 @@ -39,6 +39,9 @@ </properties> <body> <release version="2.0" date="TBD" description="TBD"> + <action dev="luc" type="add" issue="MATH-234" > + Added setter methods for rows and columns in matrices. + </action> <action dev="luc" type="add" issue="MATH-232" > Added Frobenius matrix norm. </action> Modified: commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java URL: http://svn.apache.org/viewvc/commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java?rev=724158&r1=724157&r2=724158&view=diff ============================================================================== --- commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java (original) +++ commons/proper/math/trunk/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java Sun Dec 7 08:53:05 2008 @@ -465,6 +465,26 @@ } } + public void testSetRowMatrix() { + RealMatrix m = new RealMatrixImpl(subTestData); + RealMatrix mRow3 = new RealMatrixImpl(subRow3); + assertNotSame(mRow3, m.getRowMatrix(0)); + m.setRowMatrix(0, mRow3); + assertEquals(mRow3, m.getRowMatrix(0)); + try { + m.setRowMatrix(-1, mRow3); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.setRowMatrix(0, m); + fail("Expecting InvalidMatrixException"); + } catch (InvalidMatrixException ex) { + // expected + } + } + public void testGetColumnMatrix() { RealMatrix m = new RealMatrixImpl(subTestData); RealMatrix mColumn1 = new RealMatrixImpl(subColumn1); @@ -487,6 +507,26 @@ } } + public void testSetColumnMatrix() { + RealMatrix m = new RealMatrixImpl(subTestData); + RealMatrix mColumn3 = new RealMatrixImpl(subColumn3); + assertNotSame(mColumn3, m.getColumnMatrix(1)); + m.setColumnMatrix(1, mColumn3); + assertEquals(mColumn3, m.getColumnMatrix(1)); + try { + m.setColumnMatrix(-1, mColumn3); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.setColumnMatrix(0, m); + fail("Expecting InvalidMatrixException"); + } catch (InvalidMatrixException ex) { + // expected + } + } + public void testGetRowVector() { RealMatrix m = new RealMatrixImpl(subTestData); RealVector mRow0 = new RealVectorImpl(subRow0[0]); @@ -505,7 +545,27 @@ } catch (MatrixIndexException ex) { // expected } - } + } + + public void testSetRowVector() { + RealMatrix m = new RealMatrixImpl(subTestData); + RealVector mRow3 = new RealVectorImpl(subRow3[0]); + assertNotSame(mRow3, m.getRowMatrix(0)); + m.setRowVector(0, mRow3); + assertEquals(mRow3, m.getRowVector(0)); + try { + m.setRowVector(-1, mRow3); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.setRowVector(0, new RealVectorImpl(5)); + fail("Expecting InvalidMatrixException"); + } catch (InvalidMatrixException ex) { + // expected + } + } public void testGetColumnVector() { RealMatrix m = new RealMatrixImpl(subTestData); @@ -527,6 +587,26 @@ } } + public void testSetColumnVector() { + RealMatrix m = new RealMatrixImpl(subTestData); + RealVector mColumn3 = columnToVector(subColumn3); + assertNotSame(mColumn3, m.getColumnVector(1)); + m.setColumnVector(1, mColumn3); + assertEquals(mColumn3, m.getColumnVector(1)); + try { + m.setColumnVector(-1, mColumn3); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.setColumnVector(0, new RealVectorImpl(5)); + fail("Expecting InvalidMatrixException"); + } catch (InvalidMatrixException ex) { + // expected + } + } + private RealVector columnToVector(double[][] column) { double[] data = new double[column.length]; for (int i = 0; i < data.length; ++i) { @@ -534,6 +614,98 @@ } return new RealVectorImpl(data, false); } + + public void testGetRow() { + RealMatrix m = new RealMatrixImpl(subTestData); + checkArrays(subRow0[0], m.getRow(0)); + checkArrays(subRow3[0], m.getRow(3)); + try { + m.getRow(-1); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.getRow(4); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + } + + public void testSetRow() { + RealMatrix m = new RealMatrixImpl(subTestData); + assertTrue(subRow3[0][0] != m.getRow(0)[0]); + m.setRow(0, subRow3[0]); + checkArrays(subRow3[0], m.getRow(0)); + try { + m.setRow(-1, subRow3[0]); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.setRow(0, new double[5]); + fail("Expecting InvalidMatrixException"); + } catch (InvalidMatrixException ex) { + // expected + } + } + + public void testGetColumn() { + RealMatrix m = new RealMatrixImpl(subTestData); + double[] mColumn1 = columnToArray(subColumn1); + double[] mColumn3 = columnToArray(subColumn3); + checkArrays(mColumn1, m.getColumn(1)); + checkArrays(mColumn3, m.getColumn(3)); + try { + m.getColumn(-1); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.getColumn(4); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + } + + public void testSetColumn() { + RealMatrix m = new RealMatrixImpl(subTestData); + double[] mColumn3 = columnToArray(subColumn3); + assertTrue(mColumn3[0] != m.getColumn(1)[0]); + m.setColumn(1, mColumn3); + checkArrays(mColumn3, m.getColumn(1)); + try { + m.setColumn(-1, mColumn3); + fail("Expecting MatrixIndexException"); + } catch (MatrixIndexException ex) { + // expected + } + try { + m.setColumn(0, new double[5]); + fail("Expecting InvalidMatrixException"); + } catch (InvalidMatrixException ex) { + // expected + } + } + + private double[] columnToArray(double[][] column) { + double[] data = new double[column.length]; + for (int i = 0; i < data.length; ++i) { + data[i] = column[i][0]; + } + return data; + } + + private void checkArrays(double[] expected, double[] actual) { + assertEquals(expected.length, actual.length); + for (int i = 0; i < expected.length; ++i) { + assertEquals(expected[i], actual[i]); + } + } public void testEqualsAndHashCode() { RealMatrixImpl m = new RealMatrixImpl(testData);