C - Рекурсивный алгоритм вычисления определителя двумерной матрицы - PullRequest
0 голосов
/ 20 октября 2018

Я хочу рекурсивно вычислить определитель двумерной матрицы в соответствии с определением кофакторов и их использованием при вычислении определителя.Мой код:

double **supr_mat(int size, double mat[size][size], int nb_colonne)
{
    double **temp;
    *temp = malloc((size - 1) * sizeof(double*));
    if(*temp == NULL)
        return 0;
    for(int i = 0; i < size - 1; i++)                  
    {
        temp[i] = malloc((size - 1)*sizeof(double));
        if(temp[i] == NULL)
        {
            for(int k = 0; k < i; k++)
                free(temp[i]);
            free(*temp);
            return 0;
        }
        for(int j = 0; j < size -1; j++)
            temp[i][j] = 0;
    }
    for(int i = 0; i < size - 1; i++)               //suppresses line, column.
    {
        for(int j = 0; j < size - 1; j++)
        {
            if(j<nb_colonne)
                temp[i][j] = mat[i+1][j];
            else
                temp[i][j] = mat[i+1][j+1];
        }
    }
    return temp;
}

void destroy_supr_mat(double** temp, int size)
{
    for(int i = 0; i < size; i++)
        free(temp[i]);
    free(*temp);
}

double determinant(int size, double mat[size][size])
{
    double det = 0;
    double temp[size - 1][size - 1];
    if(size == 1)
        return mat[0][0];
    for(int i = 0; i < size; i++)
    {
        temp = supr_mat(size, mat, i);
        if(i%2==0)
            det += (-1)*mat[0][i]*determinant(size - 1, temp);
        else
            det += 1*mat[0][i]*determinant(size - 1, temp);
    }
    free(temp, size - 1);
    return det;
}

Я получаю следующую ошибку: assignment to expression with array type: temp = supr_mat(size, mat, i); Я не понимаю, почему там будет такая ошибка, так как моя функция возвращает адрес, а не массив.Компиляция также дает мне несколько предупреждений о типах указателей, поэтому я думаю, что я что-то неправильно понял.Любое объяснение будет оценено.Я также полагаю, что рекурсивный алгоритм корректен, но я не уверен.

1 Ответ

0 голосов
/ 20 октября 2018

double** не совпадает с double[size - 1][size - 1].Реализовано не указатель на указатель.На самом деле это «эквивалент» ... double* (реализован как указатель на 2D-данные напрямую, а не как указатель на указатель на данные).Поэтому вы должны изменить свой код для решения этой проблемы.

Вы также можете использовать VLA на месте, вам не нужно ничего выделять (не уверен, что размер 1 работает, но вы поняли идею):

void supr_mat(int size, double mat[size][size], int nb_colonne, double temp[size-1][size-1])
{
for(int i = 0; i < size - 1; i++)               //suppresses line, column.
{
    for(int j = 0; j < size - 1; j++)
    {
        if(j<nb_colonne)
            temp[i][j] = mat[i+1][j];
        else
            temp[i][j] = mat[i+1][j+1];
    }
}
}
...