public void MakeLU() // Function for LU decomposition
{
if (!IsSquare()) throw new MException("The matrix is not square!");
L = IdentityMatrix(rows, cols);
U = Duplicate();
pi = new int[rows];
for (int i = 0; i < rows; i++) pi[i] = i;
double p = 0;
double pom2;
int k0 = 0;
int pom1 = 0;
for (int k = 0; k < cols - 1; k++)
{
p = 0;
for (int i = k; i < rows; i++) // find the row with the biggest pivot
{
if (Math.Abs(U[i, k]) > p)
{
p = Math.Abs(U[i, k]);
k0 = i;
}
}
if (p == 0) // samé nuly ve sloupci
throw new MException("The matrix is singular!");
pom1 = pi[k]; pi[k] = pi[k0]; pi[k0] = pom1; // switch two rows in permutation matrix
for (int i = 0; i < k; i++)
{
pom2 = L[k, i]; L[k, i] = L[k0, i]; L[k0, i] = pom2;
}
if (k != k0) detOfP *= -1;
for (int i = 0; i < cols; i++) // Switch rows in U
{
pom2 = U[k, i]; U[k, i] = U[k0, i]; U[k0, i] = pom2;
}
for (int i = k + 1; i < rows; i++)
{
L[i, k] = U[i, k] / U[k, k];
for (int j = k; j < cols; j++)
U[i, j] = U[i, j] - L[i, k] * U[k, j];
}
}
}