возникают проблемы при создании функции для определения определителя матрицы - PullRequest
0 голосов
/ 06 апреля 2020

Возможно, это простое исправление, но я продолжаю получать 0 в качестве определяющего, когда мне нужно получить 22, я также должен использовать динамическое распределение памяти c. Может быть некоторая проблема с использованием float, так как я не совсем знаком с тем, как они работают с указателями. Честно говоря, не знаю, что может быть причиной того, что функция выдает ноль.

cpp. sh ссылка на тест: http://cpp.sh/5bu2v

#include <iostream>
#include <math.h>
using namespace std;

float determinant(float *mat1, int &rows1)
{
    float s = 1, D = 0;
    float *temp = new float[rows1 * rows1];
    int i, j, m, n, c;
    if (rows1 == 1)
    {
        return (*(mat1 + 0 * rows1 + 0));
    }
    else
    {
        D = 0;
        for (c = 0; c < rows1; c++)
        {
            m = 0;
            n = 0;
            for (i = 0; i < rows1; i++)
            {
                for (j = 0; j < rows1; j++)
                {
                    *(temp + i * rows1 + j) = 0;
                    if (i != 0 && j != c)
                    {
                        *(temp + m * rows1 + n) = *(mat1 + i * rows1 + j);
                        if (n < (rows1 - 2))
                            n++;
                        else
                        {
                            n = 0;
                            m++;
                        }
                    }
                }
            }
            int V1 = rows1 - 1;
            D = D + s * (*(mat1 + 0 * rows1 + c) * determinant(temp, V1));
            s = -1 * s;
        }
    }
    return (D);
}


int main()
{
    int i, j;
    int n = 3;

    int matrix[10][10] = {{1, 2, 3},
                          {0, 4, 5},
                          {1, 0, 6}};
    float *mat1 = new float[n * n];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            *(mat1 + i * n + j) = matrix[i][j];
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
            cout << matrix[i][j] << " ";

        cout << endl;
    }

    cout << "Determinant of the matrix is " << determinant(mat1, n);
    return 0;
}

1 Ответ

1 голос
/ 06 апреля 2020

Ваш первый вызов в determinant, mat - это матрица 3x3, хранящаяся в одномерном массиве. Визуализируйте это так:

A B C
D E F
G H I

Вы создаете еще одну матрицу 3x3, temp.

. Ряд циклов для заполнения матрицы temp исключает первую строку и столбец c в итоге он выглядит так в первый раз:

D E 0
G H 0
0 0 0

Это передается determinant, который ожидает матрицу 2x2 . Поскольку вы передали ему что-то еще, то, что видит рекурсивный вызов, это

D E
0 G

Когда вы создаете temp, вам нужно сделать это с меньшим размером матрицы, а не с исходным размером.

...