/// <summary> /// Solve A*X = B /// </summary> /// <param name="B">A Matrix with as many rows as A and any number of columns.</param> /// <returns>so that L*U*X = B(piv,:)</returns> public Matrix Solve(Matrix B) { if (B.Rows != m) { throw new MatrixError( "Matrix row dimensions must agree."); } if (!this.IsNonsingular) { throw new MatrixError("Matrix is singular."); } // Copy right hand side with pivoting int nx = B.Cols; Matrix Xmat = B.GetMatrix(piv, 0, nx - 1); double[][] X = Xmat.Data; // 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; }
/// <summary> /// Solve A*X = B /// </summary> /// <param name="B">A Matrix with as many rows as A and any number of columns.</param> /// <returns>X so that L*U*X = B(piv,:)</returns> /// <exception cref="System.ArgumentException">Matrix row dimensions must agree.</exception> /// <exception cref="System.SystemException">Matrix is singular.</exception> public Matrix Solve( Matrix B ) { if(B.RowCount != _rowCount) { throw new ArgumentException(Resources.ArgumentMatrixSameRowDimension, "B"); } if(!this.IsNonSingular) { throw new InvalidOperationException(Resources.ArgumentMatrixNotSingular); } // Copy right hand side with pivoting int nx = B.ColumnCount; Matrix Xmat = B.GetMatrix(piv, 0, nx - 1); double[][] X = Xmat; // Solve L*Y = B(piv,:) for(int k = 0; k < _columnCount; k++) { for(int i = k + 1; i < _columnCount; i++) { for(int j = 0; j < nx; j++) { X[i][j] -= X[k][j] * LU[i][k]; } } } // Solve U*X = Y; for(int k = _columnCount - 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; }