Obliczanie wyznacznika macierzy

0
int** minor(int **m, int size, int col)
{
    int **min = new int* [size];
    for (int i=0; i < size; i++)
        min[i] = new int[size];

    int k = 0;
    for (int i=1; i < size + 1 ; i++)
        for (int j=0; j < size +1; j++)
        {
            if (j == col)
                continue;

            k = j;
            if (j>col)
                k = j - 1;

            min[i-1][k] = m[i][j];
        }

    return min;
}

int det(int **m, int size)
{
    if (size == 1)
        return m[0][0];

    int d = 0;
    for (int i=0; i<size; i++)
    {
        int** min = minor(m, size - 1, i);
        print(min, size - 1);
        d += pow(-1.0, static_cast<int>(i+2))*m[0][i]*det(min, size - 1);
        for (int j=0; j<size - 1; j++)
            delete [] min[j];
        delete [] min;
    }

    return d;
}

Mam takie 2 funkcje liczące wyznacznik macierzy. Próbuje zrozumieć o co w nich dokładnie chodzi.
Dlaczego w funkcji minor w pierwszej petli wartość i=1 a w drugiej j=0? Zakładamy ze wykreślamy pierwszy wiersz i kolejny kolumny macierzy?

0

a z jakiego wzoru się korzysta w tej metodzie?
Funkcja minor tworzy nową macierz powstałą po odrzuceniu pierwszego wiersza (tego o indeksie 0) i kolumny o indeksie col.

0

A tak można sprytnie zmniejszyć zużycie pamięci (rozwijam względem kolumny, a nie wiersza):

const int** constMinor(const int **m, int newSize, int row) {
    assert(row<=newSize);
    const int **min = new const int* [newSize];
    for (int i=0; i < row; i++)
       min[i] = m[i]+1;
    for (int i=row; i < newSize; i++)
       min[i] = m[i+1]+1;
    return min;
}

Oczywiście det() wygląda wtedy nieco inaczej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1