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

В Common Lisp существует несколько возможных подходов:

  • использовать REMOVE-IF для удаления нежелательных элементов. (В качестве альтернативы используйте REMOVE-IF-NOT, чтобы сохранить нужные элементы.) Вам понадобятся два списка. Добавляйте их.
  • используйте DOLIST и перебирайте список, собирайте элементы в два списка и добавьте их.
  • напишите рекурсивную процедуру, в которой вам нужно сохранить два списка результатов.
  • также следует использовать SORT со специальным предикатом сортировки.

Пример:

> (sort '(1 (2 6 1) 4 (8 7 -3) 4 1 (0 (9 4)) -6 10 1)
        (lambda (a b)
           (atom a)))

(1 10 -6 1 4 4 1 (2 6 1) (8 7 -3) (0 (9 4)))

В качестве стабильной версии:

(stable-sort '(1 (2 6 1) 4 (8 7 -3) 4 1 (0 (9 4)) -6 10 1)
             (lambda (a b)
               (and (atom a)
                    (not (atom b)))))

(1 4 4 1 -6 10 1 (2 6 1) (8 7 -3) (0 (9 4)))
13
задан Ciro Santilli 新疆改造中心996ICU六四事件 2 April 2016 в 11:26
поделиться

6 ответов

Ну, вы не дали нам полную реализацию. Полагаю, вы имели в виду.

int **mat = (int **)malloc(rows * sizeof(int*));
for(int i = 0; i < rows; i++) mat[i] = (int *)malloc(cols * sizeof(int));

Вот еще один вариант:

int *mat = (int *)malloc(rows * cols * sizeof(int));

Затем вы моделируете матрицу, используя

int offset = i * cols + j;
// now mat[offset] corresponds to m(i, j)

для порядка следования строк и

int offset = i + rows * j;
// not mat[offset] corresponds to m(i, j)

для порядка следования столбцов.

Один из этих двух вариантов на самом деле является предпочтительным способом работы с матрицей в C. Это потому, что теперь матрица будет храниться в памяти и вы извлечете выгоду из -локальности. В принципе, процессорный кэш будет намного счастливее с вами.

28
ответ дан 1 December 2019 в 06:53
поделиться

Как насчет просто:

int* mat = malloc(rows * columns * sizeof(int));
2
ответ дан 1 December 2019 в 06:53
поделиться

Другие ответы уже охватывали их, но для полноты, COMP.LANG.C FAQ имеет соответствующую запись:

Как я могу динамически выделять многомерное массив?

6
ответ дан 1 December 2019 в 06:53
поделиться

Вы можете свернуть его на один вызов malloc, но если вы хотите использовать стиль массива 2d, вам все равно нужен цикл.

int** matrix = (int*)malloc(rows * cols * sizeof(int) + rows * sizeof(int*));

for (int i = 0; i < rows; i++) {
    matrix[i] = matrix + rows * sizeof(int*) + rows * cols * sizeof(int) * i;
}

Непроверенный, но вы поняли идею. Иначе я бы придерживался того, что предлагает Джейсон.

0
ответ дан 1 December 2019 в 06:53
поделиться

Для N-мерного массива вы можете сделать это:

int *matrix = malloc(D1 * D2 * .. * Dn * sizeof(int)); // Di = Size of dimension i

Для доступа к ячейке массива с типичным способом вы можете сделать это:

int index = 0;
int curmul = 1;
int i;
int indexes = {I1, I2, ..., In}; // Ii = Index in dimension i

for(i = N-1; i >= 0; i--) {
    index = index + indexes(i) * curmul;
    curmul = curmul * Di;
}

(Примечание: не тестировал сейчас, но должен работать. Переведен с моего кода MatLab, но в индексе MatLab начинается с 1, поэтому я могу допустить ошибку (но я так не думаю))

-1
ответ дан 1 December 2019 в 06:53
поделиться

Вы также можете использовать Calloc, который дополнительно нулевой инициализирует для вас матрицу. Подпись немного отличается:

int *mat = (int *)calloc(rows * cols, sizeof(int));
2
ответ дан 1 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: