Определитель матрицы

manisha

using System;
 
class MyCSharp
{
    // точка входа;
    static private void Main()
    {
        const int n = 5;
        const int BASE = 100;
        Random rand = new Random(); 
        ******[,] matrix = new ******[n, n];
        for (int i = 0; i < n; ++i)
            for (int j = 0; j < n; ++j)
                matrix[i, j] = rand.Next() % BASE; // заполняем матрицу случайными элементами;
        printMatrix(matrix, n); // распечатываем сгенерированную матрицу;
        ****** det = Determinant(matrix, 5); // вычисляем определитель матрицы;
        Console.WriteLine("Определитель равен = {0}", det); 
        Console.ReadKey();
    }
    // статический метод вычисления определителя матрицы;
    static private ****** Determinant(******[,] matrix, int n)
    {
        if (n == 1) // если матрица первого порядка, то ее определитель есть единственный элемент;
            return matrix[0, 0]; // возвращаем его;
        if (allOfFirstElenemtAreZero(matrix, n)) // если есть нулевой столбец, то определитель равен 0;
            return 0;
        int comparisons; // число перестановок строк;
        sortArrayByFirstElenemt(matrix, n, out comparisons); // сортируем матрицу по первым элементам строк;
        for (int i = 1; i < n; ++i) // итерация методом Гаусса;
        {
            ****** index = matrix[i, 0] / matrix[0, 0];
            for (int j = 0; j < n; ++j)
                matrix[i, j] -= index * matrix[0, j];
        } // где зануляется первый столбец с 1 по n - 1 строки;
        //printMatrix(matrix, n);  можно распечатывать промежуточную матрицу;
        return matrix[0, 0] * Math.Pow(-1, comparisons) * Determinant(generateSubMatrix(matrix, n), n - 1);
        // возвращаем определитель рекурсивно;
    }
    // статический метод для сваппинга 2х линейных массивов; 
    static private void swapArray(******[,] matrix, int index, int lengthOfMatrix)
    {
        for (int i = 0; i < lengthOfMatrix; ++i)
            **********(ref matrix[index, i], ref matrix[index + 1, i]);
    }
    // статический метод для своппинга 2х элементов;
    static private void **********(ref ****** Buffer1, ref ****** Buffer2)
    {
        ****** Tmp = Buffer1;
        Buffer1 = Buffer2;
        Buffer2 = Tmp;
    }
    // сортировка матрицы по первым элементам строк модифицированным методом пузырька;
    static private void sortArrayByFirstElenemt(******[,] matrix, int n, out int comparisons)
    {
        comparisons = new int();
        bool flagOfSwapping = true;
        int numberOfIteration = new int();
        while (flagOfSwapping) // цикл выполняется пока есть хотя бы одна перестановка в ходе итерации;
        {
            flagOfSwapping = false;
            for (int i = 0; i < n - 1 - numberOfIteration; ++i)
                if (matrix[i, 0] < matrix[i + 1, 0])
                {
                    swapArray(matrix, i, n);
                    flagOfSwapping = true;
                    ++comparisons;
                }
            numberOfIteration++;
        }
    }
    // статический метод вывода матрицы на экран;
    static private void printMatrix(******[,] matrix, int n)
    {
        Console.WriteLine();
        for (int i = 0; i < n; ++i)
        {
            for (int j = 0; j < n; ++j)
                Console.Write("{0:f2}\t", matrix[i, j]);
            Console.WriteLine();
        }
    }
    // статический метод выделения подматрицы размера n - 1;
    static private ******[,] generateSubMatrix(******[,] matrix, int n)
    {
        ******[,] subMatrix = new ******[n - 1, n - 1];
        for (int i = 1; i < n; ++i) // выделяется подматрица со строк [1, n);
            for (int j = 1; j < n; ++j) // .. cтолбцов [1; n);
                subMatrix[i - 1, j - 1] = matrix[i, j];
        return subMatrix;
    }
    // статический метод проверки первого столбца на равенства нулевому;
    static private bool allOfFirstElenemtAreZero(******[,] matrix, int n)
    {
        for (int i = 0; i < n; ++i)
            if (matrix[i, 0] != 0)
                return false;
        return true;
    }
}
Подскажите пожалуйста, какой метод нахождения определителя используется в данном коде. Не нашел ни одного метода, где использовалась бы сортировка матрицы по первым элементам строк, выделение подматриц и т.д.Очень хочется разобраться в данном примере.
1 ответ

manisha

Используется обыкновенное разложение по столбцу, только предварительно первый столбец упрощается до вида (N 0 ... 0).