public Matrix Solve(Matrix B)
{
if (B.Rows != m)
{
throw new MatrixError(
"Matrix row dimensions must agree.");
}
if (!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;
}