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:
parent
ef2faa199c
commit
78677f2223
|
@ -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,10 +46,10 @@ 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 {
|
||||
|
||||
|
||||
/** Serializable version identifier */
|
||||
static final long serialVersionUID = 4237564493130426188L;
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -841,6 +863,57 @@ public class RealMatrixImpl implements RealMatrix, Serializable {
|
|||
res.append("}");
|
||||
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
|
||||
|
||||
|
|
|
@ -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) */
|
||||
|
|
Loading…
Reference in New Issue