//@Override public void solve(DMatrixRMaj B, DMatrixRMaj X) { double[] b = TriangularSolver_DSCC.adjust(gb, B.numRows); double[] bp = TriangularSolver_DSCC.adjust(gbp, B.numRows); double[] x = TriangularSolver_DSCC.adjust(gx, X.numRows); int[] pinv = qr.getStructure().getPinv(); // process each column in X and B individually for (int colX = 0; colX < X.numCols; colX++) { int index = colX; for (int i = 0; i < B.numRows; i++, index += X.numCols) { b[i] = B.data[index]; } // apply row pivots CommonOps_DSCC.permuteInv(pinv, b, bp, m); // apply Householder reflectors for (int j = 0; j < n; j++) { QrHelperFunctions_DSCC.applyHouseholder(qr.getV(), j, qr.getBeta(j), bp); } // Solve for R*x = b TriangularSolver_DSCC.solveU(qr.getR(), bp); // undo the permutation double[] output; if (qr.isFillPermutated()) { CommonOps_DSCC.permute(qr.getFillPermutation(), bp, x, X.numRows); output = x; } else { output = bp; } index = colX; for (int i = 0; i < X.numRows; i++, index += X.numCols) { X.data[index] = output[i]; } } }
//@Override public void solve(DMatrixRMaj B, DMatrixRMaj X) { // if( B.numCols != X.numCols || B.numRows != numRows || X.numRows != numCols) { // throw new ArgumentException("Unexpected matrix size"); // } int[] pinv = decomposition.getPinv(); int[] q = decomposition.getReducePermutation(); double[] x = TriangularSolver_DSCC.adjust(gx, X.numRows); double[] b = TriangularSolver_DSCC.adjust(gb, B.numRows); DMatrixSparseCSC L = decomposition.getL(); DMatrixSparseCSC U = decomposition.getU(); bool reduceFill = decomposition.getReduceFill() != null; // process each column in X and B individually for (int colX = 0; colX < X.numCols; colX++) { int index = colX; for (int i = 0; i < B.numRows; i++, index += X.numCols) { b[i] = B.data[index]; } CommonOps_DSCC.permuteInv(pinv, b, x, X.numRows); TriangularSolver_DSCC.solveL(L, x); TriangularSolver_DSCC.solveU(U, x); double[] d; if (reduceFill) { CommonOps_DSCC.permute(q, x, b, X.numRows); d = b; } else { d = x; } index = colX; for (int i = 0; i < X.numRows; i++, index += X.numCols) { X.data[index] = d[i]; } } }
//@Override public void solve(DMatrixRMaj B, DMatrixRMaj X) { DMatrixSparseCSC L = cholesky.getL(); int N = L.numRows; double[] b = TriangularSolver_DSCC.adjust(gb, N); double[] x = TriangularSolver_DSCC.adjust(gx, N); int[] Pinv = reduce.getArrayPinv(); for (int col = 0; col < B.numCols; col++) { int index = col; for (int i = 0; i < N; i++, index += B.numCols) { b[i] = B.data[index]; } if (Pinv != null) { CommonOps_DSCC.permuteInv(Pinv, b, x, N); TriangularSolver_DSCC.solveL(L, x); TriangularSolver_DSCC.solveTranL(L, x); CommonOps_DSCC.permute(Pinv, x, b, N); } else { TriangularSolver_DSCC.solveL(L, b); TriangularSolver_DSCC.solveTranL(L, b); } index = col; for (int i = 0; i < N; i++, index += X.numCols) { X.data[index] = b[i]; } } }