private DoubleArray multiply(TridiagonalMatrix matrix, DoubleArray vector) { double[] a = matrix.getLowerSubDiagonalData(); double[] b = matrix.getDiagonalData(); double[] c = matrix.getUpperSubDiagonalData(); double[] x = vector.toArrayUnsafe(); int n = x.length; ArgChecker.isTrue(b.length == n, "Matrix/vector size mismatch"); double[] res = new double[n]; int i; res[0] = b[0] * x[0] + c[0] * x[1]; res[n - 1] = b[n - 1] * x[n - 1] + a[n - 2] * x[n - 2]; for (i = 1; i < n - 1; i++) { res[i] = a[i - 1] * x[i - 1] + b[i] * x[i] + c[i] * x[i + 1]; } return DoubleArray.ofUnsafe(res); }
private DoubleArray multiply(DoubleArray vector, TridiagonalMatrix matrix) { double[] a = matrix.getLowerSubDiagonalData(); double[] b = matrix.getDiagonalData(); double[] c = matrix.getUpperSubDiagonalData(); double[] x = vector.toArrayUnsafe(); int n = x.length; ArgChecker.isTrue(b.length == n, "Matrix/vector size mismatch"); double[] res = new double[n]; int i; res[0] = b[0] * x[0] + a[0] * x[1]; res[n - 1] = b[n - 1] * x[n - 1] + c[n - 2] * x[n - 2]; for (i = 1; i < n - 1; i++) { res[i] = a[i] * x[i + 1] + b[i] * x[i] + c[i - 1] * x[i - 1]; } return DoubleArray.ofUnsafe(res); }
@Override public DoubleMatrix apply(TridiagonalMatrix x) { ArgChecker.notNull(x, "x"); double[] a = x.getDiagonalData(); double[] b = x.getUpperSubDiagonalData(); double[] c = x.getLowerSubDiagonalData();
@Test public void testGetters() { assertTrue(Arrays.equals(A, M.getDiagonalData())); assertTrue(Arrays.equals(B, M.getUpperSubDiagonalData())); assertTrue(Arrays.equals(C, M.getLowerSubDiagonalData())); final int n = A.length; final DoubleMatrix matrix = M.toDoubleMatrix(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { assertEquals(matrix.get(i, j), A[i], 0); } else if (j == i + 1) { assertEquals(matrix.get(i, j), B[j - 1], 0); } else if (j == i - 1) { assertEquals(matrix.get(i, j), C[j], 0); } else { assertEquals(matrix.get(i, j), 0, 0); } } } }