psteitz 2004/10/24 19:21:20 Modified: math/src/java/org/apache/commons/math/linear BigMatrix.java BigMatrixImpl.java Log: Added Matrix-valued row, column, and subMatrix accessors as suggested by Kim van der Linde (Pr #30897). Implemented equals and hashcode. Modified toString() to handle empty matrix. Revision Changes Path 1.8 +49 -1 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- BigMatrix.java 5 Sep 2004 01:19:23 -0000 1.7 +++ BigMatrix.java 25 Oct 2004 02:21:20 -0000 1.8 @@ -152,6 +152,54 @@ BigDecimal getNorm(); /** + * Gets a submatrix. Rows and columns are indicated + * counting from 0 to n-1. + * + * @param startRow Initial row index + * @param endRow Final row index + * @param startColumn Initial column index + * @param endColumn Final column index + * @return The subMatrix containing the data of the + * specified rows and columns + * @exception MatrixIndexException if the indices are not valid + */ + BigMatrix getSubMatrix(int startRow, int endRow, int startColumn, + int endColumn) throws MatrixIndexException; + + /** + * Gets a submatrix. Rows and columns are indicated + * counting from 0 to n-1. + * + * @param selectedRows Array of row indices. + * @param selectedColumns Array of column indices. + * @return The subMatrix containing the data in the + * specified rows and columns + * @exception MatrixIndexException if row or column selections are not valid + */ + BigMatrix getSubMatrix(int[] selectedRows, int[] selectedColumns) + throws MatrixIndexException; + + /** + * Returns the entries in row number <code>row</code> + * as a row matrix. Row indices start at 0. + * + * @param row the row to be fetched + * @return row matrix + * @throws MatrixIndexException if the specified row index is invalid + */ + BigMatrix getRowMatrix(int row) throws MatrixIndexException; + + /** + * Returns the entries in column number <code>column</code> + * as a column matrix. Column indices start at 0. + * + * @param column the column to be fetched + * @return column matrix + * @throws MatrixIndexException if the specified column index is invalid + */ + BigMatrix getColumnMatrix(int column) throws MatrixIndexException; + + /** * Returns the entries in row number <code>row</code> as an array. * <p> * Row indices start at 0. A <code>MatrixIndexException</code> is thrown 1.7 +168 -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.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- BigMatrixImpl.java 5 Sep 2004 01:19:23 -0000 1.6 +++ BigMatrixImpl.java 25 Oct 2004 02:21:20 -0000 1.7 @@ -430,6 +430,108 @@ } /** + * Gets a submatrix. Rows and columns are indicated + * counting from 0 to n-1. + * + * @param startRow Initial row index + * @param endRow Final row index + * @param startColumn Initial column index + * @param endColumn Final column index + * @return The subMatrix containing the data of the + * specified rows and columns + * @exception MatrixIndexException if row or column selections are not valid + */ + public BigMatrix getSubMatrix(int startRow, int endRow, int startColumn, + int endColumn) throws MatrixIndexException { + if (startRow < 0 || startRow > endRow || endRow > data.length || + startColumn < 0 || startColumn > endColumn || + endColumn > data[0].length ) { + throw new MatrixIndexException( + "invalid row or column index selection"); + } + BigMatrixImpl subMatrix = new BigMatrixImpl(endRow - startRow+1, + endColumn - startColumn+1); + BigDecimal[][] subMatrixData = subMatrix.getDataRef(); + for (int i = startRow; i <= endRow; i++) { + for (int j = startColumn; j <= endColumn; j++) { + subMatrixData[i - startRow][j - startColumn] = data[i][j]; + } + } + return subMatrix; + } + + /** + * Gets a submatrix. Rows and columns are indicated + * counting from 0 to n-1. + * + * @param selectedRows Array of row indices must be non-empty + * @param selectedColumns Array of column indices must be non-empty + * @return The subMatrix containing the data in the + * specified rows and columns + * @exception MatrixIndexException if supplied row or column index arrays + * are not valid + */ + public BigMatrix getSubMatrix(int[] selectedRows, int[] selectedColumns) + throws MatrixIndexException { + if (selectedRows.length * selectedColumns.length == 0) { + throw new MatrixIndexException( + "selected row and column index arrays must be non-empty"); + } + BigMatrixImpl subMatrix = new BigMatrixImpl(selectedRows.length, + selectedColumns.length); + BigDecimal[][] subMatrixData = subMatrix.getDataRef(); + try { + for (int i = 0; i < selectedRows.length; i++) { + for (int j = 0; j < selectedColumns.length; j++) { + subMatrixData[i][j] = data[selectedRows[i]][selectedColumns[j]]; + } + } + } + catch (ArrayIndexOutOfBoundsException e) { + throw new MatrixIndexException("matrix dimension mismatch"); + } + return subMatrix; + } + + /** + * Returns the entries in row number <code>row</code> + * as a row matrix. Row indices start at 0. + * + * @param row the row to be fetched + * @return row matrix + * @throws MatrixIndexException if the specified row index is invalid + */ + public BigMatrix getRowMatrix(int row) throws MatrixIndexException { + if ( !isValidCoordinate( row, 0)) { + throw new MatrixIndexException("illegal row argument"); + } + int ncols = this.getColumnDimension(); + BigDecimal[][] out = new BigDecimal[1][ncols]; + System.arraycopy(data[row], 0, out[0], 0, ncols); + return new BigMatrixImpl(out); + } + + /** + * Returns the entries in column number <code>column</code> + * as a column matrix. Column indices start at 0. + * + * @param column the column to be fetched + * @return column matrix + * @throws MatrixIndexException if the specified column index is invalid + */ + public BigMatrix getColumnMatrix(int column) throws MatrixIndexException { + if ( !isValidCoordinate( 0, column)) { + throw new MatrixIndexException("illegal column argument"); + } + int nRows = this.getRowDimension(); + BigDecimal[][] out = new BigDecimal[nRows][1]; + for (int row = 0; row < nRows; row++) { + out[row][0] = data[row][column]; + } + return new BigMatrixImpl(out); + } + + /** * Returns the entries in row number <code>row</code> as an array. * <p> * Row indices start at 0. A <code>MatrixIndexException</code> is thrown @@ -1005,20 +1107,74 @@ public String toString() { StringBuffer res = new StringBuffer(); res.append("BigMatrixImpl{"); - for (int i = 0; i < data.length; i++) { - if (i > 0) - res.append(","); - res.append("{"); - for (int j = 0; j < data[0].length; j++) { - if (j > 0) + if (data != null) { + for (int i = 0; i < data.length; i++) { + if (i > 0) res.append(","); - res.append(data[i][j]); - } //for - res.append("}"); - } //for + res.append("{"); + for (int j = 0; j < data[0].length; j++) { + if (j > 0) + res.append(","); + res.append(data[i][j]); + } + res.append("}"); + } + } res.append("}"); return res.toString(); - } //toString + } + + /** + * Returns true iff <code>object</code> is a + * <code>BigMatrixImpl</code> instance with the same dimensions as this + * and all corresponding matrix entries are equal. BigDecimal.equals + * is used to compare corresponding entries. + * + * @param object the object to test equality against. + * @return true if object equals this + */ + public boolean equals(Object object) { + if (object == this ) { + return true; + } + if (object instanceof BigMatrixImpl == false) { + return false; + } + BigMatrix m = (BigMatrix) object; + int nRows = getRowDimension(); + int nCols = getColumnDimension(); + if (m.getColumnDimension() != nCols || m.getRowDimension() != nRows) { + return false; + } + for (int row = 0; row < nRows; row++) { + for (int col = 0; col < nCols; col++) { + if (!data[row][col].equals(m.getEntry(row, col))) { + return false; + } + } + } + return true; + } + + /** + * Computes a hashcode for the matrix. + * + * @return hashcode for matrix + */ + public int hashCode() { + int ret = 7; + int nRows = getRowDimension(); + int nCols = getColumnDimension(); + ret = ret * 31 + nRows; + ret = ret * 31 + nCols; + for (int row = 0; row < nRows; row++) { + for (int col = 0; col < nCols; col++) { + ret = ret * 31 + (11 * (row+1) + 17 * (col+1)) * + data[row][col].hashCode(); + } + } + return ret; + } //------------------------ Protected methods
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]