Я получаю ошибку в моем коде C ++! & Как найти определитель и обратную матрицу в c ++? - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь сделать матричный калькулятор.в котором я почти сделал все операции, которые требовались в матрице.Так что теперь я пытаюсь написать код, чтобы найти определитель и обратную матрицу, но я получаю ошибку вроде: - аргумент типа "int" несовместим с параметром типа "double (*) [100]"

Я использую Visual Studio 2019.
int dat(int n, double mat[100][100]) //function
{
    Matrix s1;
    double det = 0;
    int p, r, c, subi, i, j, subj;
    int submat[10][10];
    s1.getmatrix1();
    r = c = n;
    if (n == 2)
        return((mat[0][0] * mat[1][1]) * (mat[1][0] * mat[0][1]));
    else
    {
        for (p = 0; p < n; p++)
        {
            subi = 0;
            for (i = 0; i < n; i++)
            {
                subj = 0;
                for (j = 0; j < n; j++)
                {
                    if (j == c)
                        continue;
                    submat[subi][subj] = mat[i][j];
                    subj++;
                }
                subi++;
            }
            det = det + (pow(-1, p) * mat[0][p] * dat(n - 1, submat[i][j])); //here at 'submat' i'm getting that error. 
        }
    }
    return 0;
};

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Вы передаете (i, j) -й элемент submat функции dat ().

submat [i] [j] является целым.Но функция dat () ожидает двумерный массив значений типа double (со вторым измерением равным 100, поэтому даже замена его на

dat(n-1, submat)

не будет правильной

0 голосов
/ 08 июля 2019

Есть несколько проблем с вашим кодом, кроме ошибки компиляции.

1) Поскольку dat ожидает, что второй аргумент будет массивом, вызов функции должен быть:

det = det + (pow(-1, p) * mat[0][p] * dat(n - 1, submat));

2) Определитель матрицы 2x2 должен быть рассчитан следующим образом:

return((mat[0][0] * mat[1][1]) - (mat[1][0] * mat[0][1]));

3) int submat[10][10] должно быть double submat[100][100], поскольку оно должно содержать (почти) столько элементов, сколько mat, и хранить тот же тип данных.

4) Возвращаемое значение должно быть double вместо int.

5) Условие if (j == c) должно быть if (j == p), поскольку p - это строка / столбец, который мы хотим исключить.

6) Цикл i должен начинаться с 1, поскольку мы не включаем первую строку / столбец в подматрицу.

7) s1, r и c никогда не используются и могут быть удалены.

8) Возвращаемое значение должно быть det

Примечание: временная сложность этого алгоритма, называемого Расширение Лапласа , составляет O(n!) (см. здесь ). Если вы хотите использовать его для производственного кода, я настоятельно рекомендую использовать более эффективный алгоритм, основанный на разложении матриц.

...