Implemented equals and hashCode.

git-svn-id: https://svn.apache.org/repos/asf/jakarta/commons/proper/math/trunk@141463 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Phil Steitz 2004-10-10 05:23:16 +00:00
parent ef2faa199c
commit 78677f2223
2 changed files with 115 additions and 27 deletions

View File

@ -15,7 +15,10 @@
*/
package org.apache.commons.math.linear;
import java.io.Serializable;
import org.apache.commons.math.util.MathUtils;
/**
* Implementation for RealMatrix using a double[][] array to store entries
@ -43,7 +46,7 @@ import java.io.Serializable;
* is 0-based -- e.g., <code>getEntry(0, 0)</code>
* returns the element in the first row, first column of the matrix.</li></ul>
*
* @version $Revision: 1.30 $ $Date: 2004/10/09 22:39:22 $
* @version $Revision: 1.31 $ $Date: 2004/10/10 05:23:16 $
*/
public class RealMatrixImpl implements RealMatrix, Serializable {
@ -91,8 +94,27 @@ public class RealMatrixImpl implements RealMatrix, Serializable {
* The input array is copied, not referenced.
*
* @param d data for new matrix
* @throws IllegalArgumentException if data is not rectangular (not all
* rows have the same length) or data is empty
* @throws NullPointerException if data is null
*/
public RealMatrixImpl(double[][] d) {
int nRows = d.length;
if (nRows == 0) {
throw new IllegalArgumentException(
"Matrix must have at least one row.");
}
int nCols = d[0].length;
if (nCols == 0) {
throw new IllegalArgumentException(
"Matrix must have at least one column.");
}
for (int row = 1; row < nRows; row++) {
if (d[row].length != nCols) {
throw new IllegalArgumentException(
"All input rows must have the same length.");
}
}
this.copyIn(d);
lu = null;
}
@ -842,6 +864,57 @@ public class RealMatrixImpl implements RealMatrix, Serializable {
return res.toString();
} //toString
/**
* Returns true iff <code>object</code> is a
* <code>RealMatrixImpl</code> instance with the same dimensions as this
* and all corresponding matrix entries are equal.
*
* @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 RealMatrixImpl == false) {
return false;
}
RealMatrix m = (RealMatrix) 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] != 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 + 17 * col) *
MathUtils.hash(data[row][col]);
}
}
return ret;
}
//------------------------ Protected methods
/**

View File

@ -22,7 +22,7 @@ import junit.framework.TestSuite;
/**
* Test cases for the {@link RealMatrixImpl} class.
*
* @version $Revision: 1.17 $ $Date: 2004/10/09 22:39:22 $
* @version $Revision: 1.18 $ $Date: 2004/10/10 05:23:16 $
*/
public final class RealMatrixImplTest extends TestCase {
@ -508,22 +508,25 @@ public final class RealMatrixImplTest extends TestCase {
RealMatrix mRows03Cols123 = new RealMatrixImpl(subRows03Cols123);
RealMatrix mRows20Cols123 = new RealMatrixImpl(subRows20Cols123);
RealMatrix mRows31Cols31 = new RealMatrixImpl(subRows31Cols31);
assertClose("Rows23Cols00", mRows23Cols00,
m.getSubMatrix(2 , 3 , 0, 0), normTolerance );
assertClose("Rows00Cols33", mRows00Cols33,
m.getSubMatrix(0 , 0 , 3, 3), normTolerance );
assertClose("Rows01Cols23", mRows01Cols23,
m.getSubMatrix(0 , 1 , 2, 3), normTolerance );
assertClose("Rows02Cols13", mRows02Cols13,
m.getSubMatrix(new int[] {0,2}, new int[] {1,3}), normTolerance);
assertClose("Rows03Cols12", mRows03Cols12,
m.getSubMatrix(new int[] {0,3}, new int[] {1,2}), normTolerance);
assertClose("Rows03Cols123", mRows03Cols123,
m.getSubMatrix(new int[] {0,3}, new int[] {1,2,3}), normTolerance);
assertClose("Rows20Cols123", mRows20Cols123,
m.getSubMatrix(new int[] {2,0}, new int[] {1,2,3}), normTolerance);
assertClose("Rows31Cols31", mRows31Cols31,
m.getSubMatrix(new int[] {3,1}, new int[] {3,1}), normTolerance);
assertEquals("Rows23Cols00", mRows23Cols00,
m.getSubMatrix(2 , 3 , 0, 0));
assertEquals("Rows00Cols33", mRows00Cols33,
m.getSubMatrix(0 , 0 , 3, 3));
assertEquals("Rows01Cols23", mRows01Cols23,
m.getSubMatrix(0 , 1 , 2, 3));
assertEquals("Rows02Cols13", mRows02Cols13,
m.getSubMatrix(new int[] {0,2}, new int[] {1,3}));
assertEquals("Rows03Cols12", mRows03Cols12,
m.getSubMatrix(new int[] {0,3}, new int[] {1,2}));
assertEquals("Rows03Cols123", mRows03Cols123,
m.getSubMatrix(new int[] {0,3}, new int[] {1,2,3}));
assertEquals("Rows20Cols123", mRows20Cols123,
m.getSubMatrix(new int[] {2,0}, new int[] {1,2,3}));
assertEquals("Rows31Cols31", mRows31Cols31,
m.getSubMatrix(new int[] {3,1}, new int[] {3,1}));
assertEquals("Rows31Cols31", mRows31Cols31,
m.getSubMatrix(new int[] {3,1}, new int[] {3,1}));
try {
m.getSubMatrix(1,0,2,4);
fail("Expecting MatrixIndexException");
@ -566,10 +569,10 @@ public final class RealMatrixImplTest extends TestCase {
RealMatrix m = new RealMatrixImpl(subTestData);
RealMatrix mRow0 = new RealMatrixImpl(subRow0);
RealMatrix mRow3 = new RealMatrixImpl(subRow3);
assertClose("Row0", mRow0,
m.getRowMatrix(0), normTolerance );
assertClose("Row3", mRow3,
m.getRowMatrix(3), normTolerance );
assertEquals("Row0", mRow0,
m.getRowMatrix(0));
assertEquals("Row3", mRow3,
m.getRowMatrix(3));
try {
m.getRowMatrix(-1);
fail("Expecting MatrixIndexException");
@ -588,10 +591,10 @@ public final class RealMatrixImplTest extends TestCase {
RealMatrix m = new RealMatrixImpl(subTestData);
RealMatrix mColumn1 = new RealMatrixImpl(subColumn1);
RealMatrix mColumn3 = new RealMatrixImpl(subColumn3);
assertClose("Column1", mColumn1,
m.getColumnMatrix(1), normTolerance );
assertClose("Column3", mColumn3,
m.getColumnMatrix(3), normTolerance );
assertEquals("Column1", mColumn1,
m.getColumnMatrix(1));
assertEquals("Column3", mColumn3,
m.getColumnMatrix(3));
try {
m.getColumnMatrix(-1);
fail("Expecting MatrixIndexException");
@ -606,6 +609,18 @@ public final class RealMatrixImplTest extends TestCase {
}
}
public void testEqualsAndHashCode() {
RealMatrixImpl m = new RealMatrixImpl(testData);
RealMatrixImpl m1 = (RealMatrixImpl) m.copy();
RealMatrixImpl mt = (RealMatrixImpl) m.transpose();
assertTrue(m.hashCode() != mt.hashCode());
assertEquals(m.hashCode(), m1.hashCode());
assertEquals(m, m);
assertEquals(m, m1);
assertFalse(m.equals(null));
assertFalse(m.equals(mt));
}
//--------------- -----------------Protected methods
/** verifies that two matrices are close (1-norm) */