public static Tuple<Matrix, Matrix, Matrix> LU(Matrix A)
{
// TODO: FINISH ALGORITHM
if (A.Rows != A.Cols)
throw new InvalidOperationException("Factorization requires a symmetric positive semidefinite matrix!");
int n = A.Rows;
Matrix P = Pivot(A);
Matrix M = P * A;
Matrix L = Identity(n);
Matrix U = Zeros(n);
for (int j = 0; j < n; j++)
{
L[j, j] = 1;
for (int i = 0; i < j + 1; i++)
{
U[i, j] = M[i, j];
for (int k = 0; k < i; k++)
U[i, j] -= U[k, j] * L[i, k];
}
for (int i = j; i < n; i++)
{
L[i, j] = M[i, j];
for (int k = 0; k < j; k++)
L[i, j] -= U[k, j] * L[i, k];
if (U[j, j] == 0)
System.Diagnostics.Debug.WriteLine("Unstable divisor...");
L[i, j] /= U[j, j];
}
}
return new Tuple<Matrix,Matrix,Matrix>(P, L, U);
}