psteitz 2004/10/11 23:19:50
Modified: math/xdocs/userguide linear.xml
math/src/java/org/apache/commons/math/linear RealMatrix.java
RealMatrixImpl.java
math/src/test/org/apache/commons/math/linear
RealMatrixImplTest.java
Log:
Removed data mutators from RealMatrix interface and RealMatrixImpl.
Revision Changes Path
1.9 +4 -5 jakarta-commons/math/xdocs/userguide/linear.xml
Index: linear.xml
===================================================================
RCS file: /home/cvs/jakarta-commons/math/xdocs/userguide/linear.xml,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- linear.xml 17 May 2004 05:57:38 -0000 1.8
+++ linear.xml 12 Oct 2004 06:19:50 -0000 1.9
@@ -56,11 +56,10 @@
// One more with three rows, two columns
double[][] matrixData2 = { {1d,2d}, {2d,5d}, {1d, 7d}};
-RealMatrix n = new RealMatixImpl();
-n.setData(matrixData2);
+RealMatrix n = new RealMatixImpl(matrixData2);
-// Note: both constructor and setData make
-// Fresh copies of input double[][] arrays
+// Note: constructor makes a
+// Fresh copy of the input double[][] array
// Now multiply m by n
RealMatrix p = m.multiply(n);
1.25 +1 -27
jakarta-commons/math/src/java/org/apache/commons/math/linear/RealMatrix.java
Index: RealMatrix.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/linear/RealMatrix.java,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -r1.24 -r1.25
--- RealMatrix.java 9 Oct 2004 22:39:22 -0000 1.24
+++ RealMatrix.java 12 Oct 2004 06:19:50 -0000 1.25
@@ -94,14 +94,6 @@
double[][] getData();
/**
- * Overwrites the underlying data for the matrix with
- * a fresh copy of <code>data</code>.
- *
- * @param data 2-dimensional array of entries
- */
- void setData(double[][] data);
-
- /**
* Returns the <a
href="http://mathworld.wolfram.com/MaximumAbsoluteRowSumNorm.html">
* maximum absolute row sum norm</a> of the matrix.
*
@@ -197,24 +189,6 @@
* @throws MatrixIndexException if the row or column index is not valid
*/
double getEntry(int row, int column) throws MatrixIndexException;
-
- /**
- * Sets the entry in the specified row and column to the specified value.
- * <p>
- * Row and column indices start at 0 and must satisfy
- * <ul>
- * <li><code>0 <= row < rowDimension</code></li>
- * <li><code> 0 <= column < columnDimension</code></li>
- * </ul>
- * otherwise a <code>MatrixIndexException</code> is thrown.
- *
- * @param row row location of entry to be set
- * @param column column location of entry to be set
- * @param value value to set
- * @throws MatrixIndexException if the row or column index is not valid
- */
- void setEntry(int row, int column, double value)
- throws MatrixIndexException;
/**
* Returns the transpose of this matrix.
1.33 +8 -57
jakarta-commons/math/src/java/org/apache/commons/math/linear/RealMatrixImpl.java
Index: RealMatrixImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/java/org/apache/commons/math/linear/RealMatrixImpl.java,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- RealMatrixImpl.java 10 Oct 2004 18:00:33 -0000 1.32
+++ RealMatrixImpl.java 12 Oct 2004 06:19:50 -0000 1.33
@@ -21,8 +21,8 @@
/**
- * Implementation for RealMatrix using a double[][] array to store entries
- * and <a href="http://www.math.gatech.edu/~bourbaki/math2601/Web-notes/2num.pdf">
+ * Implementation for RealMatrix using a double[][] array to store entries and
+ * <a href="http://www.math.gatech.edu/~bourbaki/math2601/Web-notes/2num.pdf">
* LU decompostion</a> to support linear system
* solution and inverse.
* <p>
@@ -34,12 +34,11 @@
* <p>
* <strong>Usage notes</strong>:<br>
* <ul><li>
- * The LU decomposition is stored and reused on subsequent calls. If matrix
- * data are modified using any of the public setXxx methods, the saved
- * decomposition is discarded. If data are modified via references to the
- * underlying array obtained using <code>getDataRef()</code>, then the stored
- * LU decomposition will not be discarded. In this case, you need to
- * explicitly invoke <code>LUDecompose()</code> to recompute the decomposition
+ * The LU decomposition is cached and reused on subsequent calls.
+ * If data are modified via references to the underlying array obtained using
+ * <code>getDataRef()</code>, then the stored LU decomposition will not be
+ * discarded. In this case, you need to explicitly invoke
+ * <code>LUDecompose()</code> to recompute the decomposition
* before using any of the methods above.</li>
* <li>
* As specified in the [EMAIL PROTECTED] RealMatrix} interface, matrix element
indexing
@@ -280,17 +279,6 @@
}
/**
- * Overwrites the underlying data for the matrix
- * with a fresh copy of <code>inData</code>.
- *
- * @param inData 2-dimensional array of entries
- */
- public void setData(double[][] inData) {
- copyIn(inData);
- lu = null;
- }
-
- /**
* Returns a reference to the underlying data array.
* <p>
* Does not make a fresh copy of the underlying data.
@@ -302,19 +290,6 @@
}
/**
- * Overwrites the underlying data for the matrix
- * with a reference to <code>inData</code>.
- * <p>
- * Does not make a fresh copy of <code>data</code>.
- *
- * @param inData 2-dimensional array of entries
- */
- public void setDataRef(double[][] inData) {
- this.data = inData;
- lu = null;
- }
-
- /**
*
* @return norm
*/
@@ -495,30 +470,6 @@
throw new MatrixIndexException("matrix entry does not exist");
}
return data[row][column];
- }
-
- /**
- * Sets the entry in the specified row and column to the specified value.
- * <p>
- * Row and column indices start at 0 and must satisfy
- * <ul>
- * <li><code>0 <= row < rowDimension</code></li>
- * <li><code> 0 <= column < columnDimension</code></li>
- * </ul>
- * otherwise a <code>MatrixIndexException</code> is thrown.
- *
- * @param row row location of entry to be set
- * @param column column location of entry to be set
- * @param value value to set
- * @throws MatrixIndexException if the row or column index is not valid
- */
- public void setEntry(int row, int column, double value)
- throws MatrixIndexException {
- if (!isValidCoordinate(row,column)) {
- throw new MatrixIndexException("matrix entry does not exist");
- }
- data[row][column] = value;
- lu = null;
}
/**
1.20 +28 -46
jakarta-commons/math/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java
Index: RealMatrixImplTest.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/math/src/test/org/apache/commons/math/linear/RealMatrixImplTest.java,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- RealMatrixImplTest.java 10 Oct 2004 18:01:16 -0000 1.19
+++ RealMatrixImplTest.java 12 Oct 2004 06:19:50 -0000 1.20
@@ -111,25 +111,13 @@
assertEquals("testData2 row dimension",m2.getRowDimension(),2);
assertEquals("testData2 column dimension",m2.getColumnDimension(),3);
assertTrue("testData2 is not square",!m2.isSquare());
- RealMatrixImpl m3 = new RealMatrixImpl();
- m3.setData(testData);
}
/** test copy functions */
public void testCopyFunctions() {
RealMatrixImpl m = new RealMatrixImpl(testData);
- RealMatrixImpl m2 = new RealMatrixImpl(testData2);
- m2.setData(m.getData());
- assertClose("getData",m2,m,entryTolerance);
- // no dangling reference...
- m2.setEntry(1,1,2000d);
- RealMatrixImpl m3 = new RealMatrixImpl(testData);
- assertClose("no getData side effect",m,m3,entryTolerance);
- m3 = (RealMatrixImpl) m.copy();
- double[][] stompMe = {{1d,2d,3d}};
- m3.setDataRef(stompMe);
- assertClose("no copy side effect",m,new RealMatrixImpl(testData),
- entryTolerance);
+ RealMatrixImpl m2 = new RealMatrixImpl(m.getData());
+ assertEquals(m2,m);
}
/** test add */
@@ -418,22 +406,14 @@
}
}
- public void testEntryMutators() {
+ public void testGetEntry() {
RealMatrix m = new RealMatrixImpl(testData);
assertEquals("get entry",m.getEntry(0,1),2d,entryTolerance);
- m.setEntry(1,2,100d);
- assertEquals("get entry",m.getEntry(1,2),100d,entryTolerance);
- try {
- double x = m.getEntry(-1,2);
- fail("expecting MatrixIndexException");
- } catch (MatrixIndexException ex) {
- ;
- }
try {
- m.setEntry(1,4,200d);
- fail("expecting MatrixIndexException");
+ m.getEntry(10, 4);
+ fail ("Expecting MatrixIndexException");
} catch (MatrixIndexException ex) {
- ;
+ // expected
}
}
@@ -475,8 +455,7 @@
RealMatrix m = new RealMatrixImpl(matrixData);
// One more with three rows, two columns
double[][] matrixData2 = { {1d,2d}, {2d,5d}, {1d, 7d}};
- RealMatrix n = new RealMatrixImpl();
- n.setData(matrixData2);
+ RealMatrix n = new RealMatrixImpl(matrixData2);
// Now multiply m by n
RealMatrix p = m.multiply(n);
assertEquals(2, p.getRowDimension());
@@ -652,24 +631,24 @@
}
/** extracts the l and u matrices from compact lu representation */
- protected void splitLU(RealMatrix lu, RealMatrix lower, RealMatrix upper)
throws InvalidMatrixException {
- if (!lu.isSquare() || !lower.isSquare() || !upper.isSquare() ||
- lower.getRowDimension() != upper.getRowDimension()
- || lower.getRowDimension() != lu.getRowDimension()) {
+ protected void splitLU(RealMatrix lu, double[][] lowerData, double[][]
upperData) throws InvalidMatrixException {
+ if (!lu.isSquare() || lowerData.length != lowerData[0].length ||
upperData.length != upperData[0].length ||
+ lowerData.length != upperData.length
+ || lowerData.length != lu.getRowDimension()) {
throw new InvalidMatrixException("incorrect dimensions");
}
int n = lu.getRowDimension();
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (j < i) {
- lower.setEntry(i, j, lu.getEntry(i, j));
- upper.setEntry(i, j, 0d);
+ lowerData[i][j] = lu.getEntry(i, j);
+ upperData[i][j] = 0d;
} else if (i == j) {
- lower.setEntry(i, j, 1d);
- upper.setEntry(i, j, lu.getEntry(i, j));
+ lowerData[i][j] = 1d;
+ upperData[i][j] = lu.getEntry(i, j);
} else {
- lower.setEntry(i, j, 0d);
- upper.setEntry(i, j, lu.getEntry(i, j));
+ lowerData[i][j] = 0d;
+ upperData[i][j] = lu.getEntry(i, j);
}
}
}
@@ -681,21 +660,24 @@
throw new IllegalArgumentException("dimension mismatch");
}
int n = matrix.getRowDimension();
- RealMatrix out = new RealMatrixImpl(n, n);
+ int m = matrix.getColumnDimension();
+ double out[][] = new double[m][n];
for (int i = 0; i < n; i++) {
- for (int j = 0; j < n; j++) {
- out.setEntry(i, j, matrix.getEntry(permutation[i], j));
+ for (int j = 0; j < m; j++) {
+ out[i][j] = matrix.getEntry(permutation[i], j);
}
}
- return out;
+ return new RealMatrixImpl(out);
}
/** Extracts l and u matrices from lu and verifies that matrix = l times u
modulo permutation */
protected void verifyDecomposition(RealMatrix matrix, RealMatrix lu) throws
Exception{
int n = matrix.getRowDimension();
- RealMatrix lower = new RealMatrixImpl(n, n);
- RealMatrix upper = new RealMatrixImpl(n, n);
- splitLU(lu, lower, upper);
+ double[][] lowerData = new double[n][n];
+ double[][] upperData = new double[n][n];
+ splitLU(lu, lowerData, upperData);
+ RealMatrix lower =new RealMatrixImpl(lowerData);
+ RealMatrix upper = new RealMatrixImpl(upperData);
int[] permutation = ((RealMatrixImpl) matrix).getPermutation();
RealMatrix permuted = permuteRows(matrix, permutation);
assertClose("lu decomposition does not work", permuted,
lower.multiply(upper), normTolerance);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]