Определить матрицу в C - PullRequest
       0

Определить матрицу в C

2 голосов
/ 15 февраля 2020

Я начал изучать C и начал новый аргумент: the matrices. Я видел, что вы можете определить матрицу двумя различными способами

WAY 1

Первый способ с использованием оператора индекса []

const int N = 3, M = 4;
int matrix[N][M];

но так как это трудно передать аргументы в функции, потому что компилятор должен знать число столбцов матрицы при компиляции программы. поэтому вам нужно сделать функцию, которая работает только для матриц с n столбцами

int my_func( int matrix[][3], const int num_lines){...}

WAY 2

Второй способ: использовать массив массивов

const int N = 3, M = 4;
int** m = (int**) calloc(N, sizeof(int*))
for (int i = 0; i < N; i++){
    m[i] = (int*) calloc(M, sizeof(int))
}

Таким образом, вы можете легко передать матричный указатель на функцию, бегло работая с ней, но единственная проблема заключается в эффективности выделения памяти и возврате значений.

ПУТЬ 3?

На самом деле я думал, что может быть третий путь, и мне было интересно, правильно ли это делать

const int N = 3, M = 4;
int array[N*M];
for (int i=0; i<N; i++){
    for (int j = 0; j<M; j++){
        printf("%d%d: %d\n", i, j, array[ i * M + j ]);
    }
}

Делать это с моей точки зрения представление должно быть таким же эффективным, как первый способ, который я написал, но вы можете работать с ним более свободно в функциях, потому что вам нужно только передать строки и столбцы в качестве аргументов

int my_func( const int* matrix, const int num_lines, const int num_columns){...}

Является ли way 3 право?

1 Ответ

4 голосов
/ 15 февраля 2020

Является ли way 3 правильным?

В системе управления памятью way 3 на дешевле , поскольку у вас не слишком много выделений, так как в way 2. Но это также ограничивает вас с точки зрения максимального размера матрицы, который можно поместить в стек.

Если вы возьмете лучшее из way 2 и way 3, у вас получится что-то вроде

typedef struct  {
    unsigned M;
    unsigned N;
    int *data;
} Matrix;

Matrix create_matrix(unsigned M, unsigned N) {
    Matrix matrix;
    matrix.M = M;
    matrix.N = N;
    matrix.data = (int*) calloc(M * N, sizeof(int));
    return matrix;
}

int* get_matrix_element(Matrix *matrix, unsigned m, unsigned n) {
    return matrix->data + m * matrix->N + n;
}

void delete_matrix(Matrix *matrix) {
    free(matrix->data);
}
...