package edu.stanford.rsl.conrad.numerics.test;
import static org.junit.Assert.*;
//import org.junit.After;
//import org.junit.AfterClass;
//import org.junit.Before;
//import org.junit.BeforeClass;
import org.junit.Test;
import edu.stanford.rsl.conrad.numerics.SimpleMatrix;
import edu.stanford.rsl.conrad.utils.TestingTools;
public class SimpleMatrixTest {
// @BeforeClass
// public static void setUpBeforeClass() throws Exception {
// }
//
// @AfterClass
// public static void tearDownAfterClass() throws Exception {
// }
//
// @Before
// public void setUp() throws Exception {
// }
//
// @After
// public void tearDown() throws Exception {
// }
@Test
public void testGetSubMatrix() {
final int m = TestingTools.rand(2, 10);
final int n = TestingTools.rand(2, 10);
SimpleMatrix M = new SimpleMatrix(m, n);
M.randomize(-1.0, 1.0);
int selectRows[] = new int[m-1];
int selectCols[] = new int[n-1];
int deleteRow;
int deleteCol;
// test removing first row and first column
for (int i = 0; i < m-1; ++i) selectRows[i] = i+1;
for (int i = 0; i < n-1; ++i) selectCols[i] = i+1;
deleteRow = 0;
deleteCol = 0;
SimpleMatrix Sff_rect = M.getSubMatrix(1, 1, m-1, n-1);
SimpleMatrix Sff_sel = M.getSubMatrix(selectRows, selectCols);
SimpleMatrix Sff_del = M.getSubMatrix(deleteRow, deleteCol);
TestingTools.assertEqualElementWise(Sff_rect, Sff_sel, 0.0);
TestingTools.assertEqualElementWise(Sff_sel, Sff_del, 0.0);
TestingTools.assertEqualElementWise(Sff_del, Sff_rect, 0.0);
// test removing last row and last column
for (int i = 0; i < m-1; ++i) selectRows[i] = i;
for (int i = 0; i < n-1; ++i) selectCols[i] = i;
deleteRow = m-1;
deleteCol = n-1;
SimpleMatrix Sll_rect = M.getSubMatrix(0, 0, m-1, n-1);
SimpleMatrix Sll_sel = M.getSubMatrix(selectRows, selectCols);
SimpleMatrix Sll_del = M.getSubMatrix(deleteRow, deleteCol);
TestingTools.assertEqualElementWise(Sll_rect, Sll_sel, 0.0);
TestingTools.assertEqualElementWise(Sll_sel, Sll_del, 0.0);
TestingTools.assertEqualElementWise(Sll_del, Sll_rect, 0.0);
}
@Test
public void testDeterminant() {
// test 1x1 matrix
SimpleMatrix M1 = new SimpleMatrix(1, 1);
M1.randomize(-1.0, 1.0);
assertEquals(M1.getElement(0, 0), M1.determinant(), TestingTools.DELTA);
// test 2x2 matrix
SimpleMatrix M2 = new SimpleMatrix(2, 2);
M2.randomize(-1.0, 1.0);
assertEquals(M2.getElement(0, 0)*M2.getElement(1, 1) - M2.getElement(0, 1)*M2.getElement(1, 0), M2.determinant(), TestingTools.DELTA);
// test 3x3 matrix
SimpleMatrix M3 = new SimpleMatrix(3, 3);
M3.randomize(-1.0, 1.0);
double det = 0.0;
det += M3.getElement(0, 0)*M3.getSubMatrix(0, 0).determinant();
det -= M3.getElement(0, 1)*M3.getSubMatrix(0, 1).determinant();
det += M3.getElement(0, 2)*M3.getSubMatrix(0, 2).determinant();
assertEquals(det, M3.determinant(), TestingTools.DELTA);
// test NxN matrix
final int N = TestingTools.rand(2, 10);
SimpleMatrix MN = new SimpleMatrix(N, N);
MN.randomize(-1.0, 1.0);
det = 0.0;
double factor = 1.0;
for (int i = 0; i < MN.getRows(); ++i) {
det += factor * MN.getElement(i, 0) * MN.getSubMatrix(i, 0).determinant();
factor *= -1.0;
}
assertEquals(det, MN.determinant(), TestingTools.DELTA);
}
@Test
public void testToStringAndFromString() {
int rows = TestingTools.rand(1, 5);
int cols = TestingTools.rand(1, 5);
SimpleMatrix M_in = new SimpleMatrix(rows, cols);
M_in.randomize(-1.0, 10.0);
SimpleMatrix M_out = new SimpleMatrix(M_in.toString());
TestingTools.assertEqualElementWise(M_in, M_out, TestingTools.DELTA);
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/