/** Solve A*X = B @param B A Matrix with as many rows as A and any number of columns. @return X so that L*U*X = B(piv,:) @exception IllegalArgumentException Matrix row dimensions must agree. @exception RuntimeException Matrix is singular. */ public CoreMatrix solve(CoreMatrix B) { if (B.getRowDimension() != m) { throw new Exception("Matrix row dimensions must agree."); } if (!this.isNonsingular()) { throw new Exception("Matrix is singular."); } // Copy right hand side with pivoting int nx = B.getColumnDimension(); CoreMatrix Xmat = B.getMatrix(piv, 0, nx - 1); double[,] X = Xmat.getArray(); // Solve L*Y = B(piv,:) for (int k = 0; k < n; k++) { for (int i = k + 1; i < n; i++) { for (int j = 0; j < nx; j++) { X[i, j] -= X[k, j] * LU[i, k]; } } } // Solve U*X = Y; for (int k = n - 1; k >= 0; k--) { for (int j = 0; j < nx; j++) { X[k, j] /= LU[k, k]; } for (int i = 0; i < k; i++) { for (int j = 0; j < nx; j++) { X[i, j] -= X[k, j] * LU[i, k]; } } } return Xmat; }