Как вычислить определитель матрицы, используя указатели в c? - PullRequest
0 голосов
/ 15 декабря 2018

Я пишу программу для вычисления определителя матрицы, используя указатели размером до 3x3, и я начал с написания формулы для матрицы 2x2.

Я получил ошибку, и она отобразила «выражение должноиметь арифметический тип "в местах круглых скобок в начале умноженных выражений.

Кажется, что программа распознает значения как указатели вместо просто умножения значений, но я тоже не уверен.Как мне это исправить?

void determinant(int size, int matrix[][MAXSIZE])
{
    int d;
    if(size == 2)
    {
        d = matrix * ((matrix + 1) + 1) - ((matrix + 1) + 0) * ((matrix + 0) + 1);
        printf("Determinant of your matrix: %d\n", d);
    }
}

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вопрос вычисления детерминанта - это базовый математический вопрос (совершенно не связанный с C), и большинство курсов по линейной алгебре объясняют, как это сделать.Вам действительно нужно понять, как вы вычислили бы это «вручную».

Другой вопрос - как представлять матрицы (как абстрактный тип данных ) вС программой.Я бы предложил использовать гибкие элементы массива (и указатели на struct -с их содержащие), и я подробно рассказал, как это сделать, в этом ответе (что, конечно, нужнодля ваших нужд).

Комбинируя оба подхода (математическая и программирующая), вы можете выполнить домашнюю работу.

Не забудьте включить все предупреждения и отладочную информацию при компиляции (например, компиляция с использованием gcc -Wall -Wextra -g с GCC ; см. Также совет, данный здесь ), ичитать Как отлаживать небольшие программы .

0 голосов
/ 15 декабря 2018

Почему бы не просто matrix[0][0] * matrix[1][1] - matrix[1][0] * matrix[0][1]?

Вы, вероятно, должны передать в функцию более безопасный тип аргумента, чем int matrix[][] (например, создать какой-то struct MATRIX_2_2).

Ради упражнения, если вы действительно хотите использовать арифметику указателей, вы, вероятно, захотите написать что-то вроде:

d = (**matrix) * (*(*(matrix + 1) + 1)) - (*(*(matrix + 0) + 1)) * (*(*(matrix + 1) + 0));

Здесь, каждый первый разыменование (это то, что звездочка) получает одномерный массив матрицы, а второй получает определенное значение.

...