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

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

13 голосов
/ 24 января 2010

Я хочу выделить матрицу.

это единственный вариант:

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

for (int index=0;index<row;++index)
{
    mat[index] = (int*)malloc(col * sizeof(int));
}

Ответы [ 7 ]

27 голосов
/ 24 января 2010

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

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. Это потому, что теперь матрица будет храниться непрерывно в памяти, и вы получите локальность ссылок . По сути, кэш процессора будет намного более счастливым с вами.

6 голосов
/ 25 января 2010

Другие ответы уже охватывали их, но для полноты в FAQ по comp.lang.c есть соответствующая запись:

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

4 голосов
/ 26 декабря 2012

что вы можете сделать, это

int (*mat)[col];
mat=(int (*)[col])malloc(sizeof(*mat)*row);

, а затем использовать эту новую матрицу как mat [i] [j]

2 голосов
/ 24 января 2010

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

int *mat = (int *)calloc(rows * cols, sizeof(int));
2 голосов
/ 24 января 2010

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

int* mat = malloc(rows * columns * sizeof(int));
0 голосов
/ 25 января 2010

Для 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, поэтому я МОГУ ошибиться (но я так не думаю))

Веселись!

0 голосов
/ 24 января 2010

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

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;
}

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

...