allocate matrix in C

前端 未结 7 1190
别跟我提以往
别跟我提以往 2020-11-29 03:49

i want to allocate a matrix.

is this the only option:

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

for (int index=0;index

        
相关标签:
7条回答
  • 2020-11-29 04:01

    what you can do is

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

    and then use this new matrix as mat[i][j]

    0 讨论(0)
  • 2020-11-29 04:02

    The other answers already covered these, but for completeness, the comp.lang.c FAQ has a relevant entry:

    How can I dynamically allocate a multidimensional array?

    0 讨论(0)
  • 2020-11-29 04:02

    How about just:

    int* mat = malloc(rows * columns * sizeof(int));
    
    0 讨论(0)
  • 2020-11-29 04:12

    You can collapse it to one call to malloc, but if you want to use a 2d array style, you still need the for loop.

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

    Untested, but you get the idea. Otherwise, I'd stick with what Jason suggests.

    0 讨论(0)
  • 2020-11-29 04:18

    For a N-Dimensional array you can do this:

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

    To access a array cell with the typical way you can do this:

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

    (Note: didnt test now but should work. Translated from my Matlab code, but in Matlab index starts from 1, so i MAY made a mistake (but i dont think so))

    Have fun!

    0 讨论(0)
  • 2020-11-29 04:23

    Well, you didn't give us a complete implementation. I assume that you meant.

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

    Here's another option:

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

    Then, you simulate the matrix using

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

    for row-major ordering and

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

    for column-major ordering.

    One of these two options is actually the preferred way of handling a matrix in C. This is because now the matrix will be stored contiguously in memory and you benefit from locality of reference. Basically, the CPU cache will a lot happier with you.

    0 讨论(0)
提交回复
热议问题