@Test public void testTransposeView() { Matrix m = Matrices.gaussianView(5, 6, 1234L); Matrix controlM = new DenseMatrix(5, 6).assign(m); System.out.printf("M=\n%s\n", m); System.out.printf("controlM=\n%s\n", controlM); Matrix mtm = Matrices.transposedView(m).times(m); Matrix controlMtm = controlM.transpose().times(controlM); System.out.printf("M'M=\n%s\n", mtm); Matrix diff = mtm.minus(controlMtm); assertEquals(0, diff.aggregate(Functions.PLUS, Functions.ABS), 1e-10); }
/** * Test for out of range column or row access. */ @Test public void testIndexRange() { Matrix m = new DenseMatrix(20, 30).assign(Functions.random()); try { m.viewColumn(30); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertTrue(e.getMessage().startsWith("Index 30 is outside allowable")); } try { m.viewRow(20); fail("Should have thrown exception"); } catch (IllegalArgumentException e) { assertTrue(e.getMessage().startsWith("Index 20 is outside allowable")); } } }
@Ignore public void fasterThanBefore() { OnlineSummarizer s1 = new OnlineSummarizer(); OnlineSummarizer s2 = new OnlineSummarizer(); Matrix a = new DenseMatrix(60, 60).assign(Functions.random()); decompositionSpeedCheck(new Decomposer() { @Override public QR decompose(Matrix a) { return new QRDecomposition(a); } }, s1, a, "new"); decompositionSpeedCheck(new Decomposer() { @Override public QR decompose(Matrix a) { return new OldQRDecomposition(a); } }, s2, a, "old"); // should be much more than twice as fast. (originally was on s2.getMedian, but we factored out com.tdunning ) System.out.printf("Speedup is about %.1f times\n", s2.getMean() / s1.getMean()); assertTrue(s1.getMean() < 0.5 * s2.getMean()); }
@Test public void testBasics() { Matrix a = new DenseSymmetricMatrix(new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, false); System.out.println(a.toString()); assertEquals(0, a.viewDiagonal().minus(new DenseVector(new double[]{1, 5, 8, 10})).norm(1), 1.0e-10); assertEquals(0, a.viewPart(0, 3, 1, 3).viewDiagonal().minus( new DenseVector(new double[]{2, 6, 9})).norm(1), 1.0e-10); assertEquals(4, a.get(0, 3), 1.0e-10); System.out.println(a); Matrix m = new DenseMatrix(4, 4).assign(a); assertEquals(0, m.minus(a).aggregate(Functions.PLUS, Functions.ABS), 1.0e-10); System.out.println(m); assertEquals(0, m.transpose().times(m).minus(a.transpose().times(a)).aggregate( Functions.PLUS, Functions.ABS), 1.0e-10); System.out.println(a.plus(a)); assertEquals(0, m.plus(m).minus(a.plus(a)).aggregate(Functions.PLUS, Functions.ABS), 1.0e-10); }
@Test(timeout=50000) public void testTimesCorrect() { Random raw = RandomUtils.getRandom(); // build two large sequential sparse matrices and multiply them Matrix x = new SparseRowMatrix(100, 2000, false) .assign(Functions.random()); Matrix y = new SparseRowMatrix(2000, 100, false) .assign(Functions.random()); Matrix xd = new DenseMatrix(100, 2000).assign(x); Matrix yd = new DenseMatrix(2000, 100).assign(y); assertEquals(0, xd.times(yd).minus(x.times(y)).aggregate(Functions.PLUS, Functions.ABS), 1e-15); assertEquals(0, x.times(yd).minus(x.times(y)).aggregate(Functions.PLUS, Functions.ABS), 1e-15); assertEquals(0, xd.times(y).minus(x.times(y)).aggregate(Functions.PLUS, Functions.ABS), 1e-15); } }
@Test public void randomMatrix() { Matrix a = new DenseMatrix(60, 60).assign(Functions.random()); QRDecomposition qr = new QRDecomposition(a); // how close is Q to actually being orthornormal? double maxIdent = qr.getQ().transpose().times(qr.getQ()).viewDiagonal().assign(Functions.plus(-1)).norm(1); assertEquals(0, maxIdent, 1.0e-13); // how close is Q R to the original value of A? Matrix z = qr.getQ().times(qr.getR()).minus(a); double maxError = z.aggregate(Functions.MIN, Functions.ABS); assertEquals(0, maxError, 1.0e-13); }
@Test public void testDeficientRank() { Matrix a = new DenseMatrix(10, 3).assign(new DoubleFunction() { private final Random gen = RandomUtils.getRandom(); @Override public double apply(double arg1) { return gen.nextGaussian(); } }); a = a.transpose().times(a); EigenDecomposition eig = new EigenDecomposition(a); Matrix d = eig.getD(); Matrix v = eig.getV(); check("EigenvalueDecomposition (rank deficient)...", a.times(v), v.times(d)); Assert.assertEquals(0, eig.getImagEigenvalues().norm(1), 1.0e-10); Assert.assertEquals(3, eig.getRealEigenvalues().norm(0), 1.0e-10); }
@Test public void random() { Matrix m = new DenseMatrix(200, 30).assign(Functions.random()); Vector b = new DenseVector(200).assign(1); LSMR r = new LSMR(); Vector x1 = r.solve(m, b); // assertEquals(0, m.times(x1).minus(b).norm(2), 1.0e-2); double norm = new SingularValueDecomposition(m).getS().viewDiagonal().norm(2); double actual = m.transpose().times(m).times(x1).minus(m.transpose().times(b)).norm(2); System.out.printf("%.4f\n", actual / norm * 1.0e6); assertEquals(0, actual, norm * 1.0e-5); // and we need to check that the error estimates are pretty good. assertEquals(m.times(x1).minus(b).norm(2), r.getResidualNorm(), 1.0e-5); assertEquals(actual, r.getNormalEquationResidual(), 1.0e-9); }
@Test public void testProjection() { Vector v1 = new DenseVector(10).assign(Functions.random()); WeightedVector v2 = new WeightedVector(v1, v1, 31); assertEquals(v1.dot(v1), v2.getWeight(), 1.0e-13); assertEquals(31, v2.getIndex()); Matrix y = new DenseMatrix(10, 4).assign(Functions.random()); Matrix q = new QRDecomposition(y.viewPart(0, 10, 0, 3)).getQ(); Vector nullSpace = y.viewColumn(3).minus(q.times(q.transpose().times(y.viewColumn(3)))); WeightedVector v3 = new WeightedVector(q.viewColumn(0).plus(q.viewColumn(1)), nullSpace, 1); assertEquals(0, v3.getWeight(), 1.0e-13); Vector qx = q.viewColumn(0).plus(q.viewColumn(1)).normalize(); WeightedVector v4 = new WeightedVector(qx, q.viewColumn(0), 2); assertEquals(Math.sqrt(0.5), v4.getWeight(), 1.0e-13); WeightedVector v5 = WeightedVector.project(q.viewColumn(0), qx); assertEquals(Math.sqrt(0.5), v5.getWeight(), 1.0e-13); }
private Matrix orthes(Matrix x) { Matrix hessenBerg = new DenseMatrix(n, n).assign(x);
@Test public void testBasics() { Matrix a = new UpperTriangular(new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, false); assertEquals(0, a.viewDiagonal().minus(new DenseVector(new double[]{1, 5, 8, 10})).norm(1), 1.0e-10); assertEquals(0, a.viewPart(0, 3, 1, 3).viewDiagonal().minus( new DenseVector(new double[]{2, 6, 9})).norm(1), 1.0e-10); assertEquals(4, a.get(0, 3), 1.0e-10); print(a); Matrix m = new DenseMatrix(4, 4).assign(a); assertEquals(0, m.minus(a).aggregate(Functions.PLUS, Functions.ABS), 1.0e-10); print(m); assertEquals(0, m.transpose().times(m).minus(a.transpose().times(a)).aggregate( Functions.PLUS, Functions.ABS), 1.0e-10); assertEquals(0, m.plus(m).minus(a.plus(a)).aggregate(Functions.PLUS, Functions.ABS), 1.0e-10); }
public static Matrix read(InputStream in, int cols) throws IOException { DataInputStream input = new DataInputStream(in); int rows = 1000; Matrix data = new DenseMatrix(rows, cols); int i = 0; while (true) { // standard sort of exponential reallocation if (i >= rows) { int newRows = 2 * rows; Matrix mx = new DenseMatrix(newRows, cols); mx.viewPart(0, rows, 0, cols).assign(data); data = mx; rows = newRows; } for (int j = 0; j < cols; j++) { try { data.setQuick(i, j, input.readShort()); } catch (EOFException e) { if (j != 0) { // ran out on partial row throw e; } // ran out of data ... trim what we got return new DenseMatrix(i, cols).assign(data.viewPart(0, i, 0, cols)); } } i++; } }
private Matrix orthes(Matrix x) { Matrix hessenBerg = new DenseMatrix(n, n).assign(x);