@Test public void testRecoverOrginal() { final DecompositionResult result = LU.apply(A); assertTrue(result instanceof LUDecompositionResult); final LUDecompositionResult lu = (LUDecompositionResult) result; final DoubleMatrix a = (DoubleMatrix) ALGEBRA.multiply(lu.getL(), lu.getU()); checkEquals((DoubleMatrix) ALGEBRA.multiply(lu.getP(), A), a); }
/** * Cubic spline is obtained by solving a linear problem Ax=b where A is a square matrix and x,b are vector * This can be done by LU decomposition * @param doubMat Matrix A * @param doubVec Vector B * @return Solution to the linear equation, x */ protected double[] matrixEqnSolver(double[][] doubMat, double[] doubVec) { LUDecompositionResult result = _luObj.apply(DoubleMatrix.copyOf(doubMat)); double[][] lMat = result.getL().toArray(); double[][] uMat = result.getU().toArray(); DoubleArray doubVecMod = ((DoubleArray) OG_ALGEBRA.multiply(result.getP(), DoubleArray.copyOf(doubVec))); return backSubstitution(uMat, forwardSubstitution(lMat, doubVecMod)); }
/** * Cubic spline and its node sensitivity are respectively obtained by solving a linear problem Ax=b where A is a square matrix and x,b are vector and AN=L where N,L are matrices * @param doubMat1 The matrix A * @param doubVec The vector b * @param doubMat2 The matrix L * @return The solutions to the linear systems, x,N */ protected DoubleArray[] combinedMatrixEqnSolver(double[][] doubMat1, double[] doubVec, double[][] doubMat2) { int nDataPts = doubVec.length; LUDecompositionResult result = _luObj.apply(DoubleMatrix.copyOf(doubMat1)); double[][] lMat = result.getL().toArray(); double[][] uMat = result.getU().toArray(); DoubleMatrix pMat = result.getP(); DoubleArray doubVecMod = ((DoubleArray) OG_ALGEBRA.multiply(pMat, DoubleArray.copyOf(doubVec))); DoubleMatrix doubMat2Matrix = DoubleMatrix.copyOf(doubMat2); DoubleArray[] res = new DoubleArray[nDataPts + 1]; res[0] = DoubleArray.copyOf(backSubstitution(uMat, forwardSubstitution(lMat, doubVecMod))); for (int i = 0; i < nDataPts; ++i) { DoubleArray doubMat2Colum = doubMat2Matrix.column(i); DoubleArray doubVecMod2 = ((DoubleArray) OG_ALGEBRA.multiply(pMat, doubMat2Colum)); res[i + 1] = DoubleArray.copyOf(backSubstitution(uMat, forwardSubstitution(lMat, doubVecMod2))); } return res; }