如何在堆内存中存储矩阵

时间:2012-08-30 09:34:40

标签: c

下面我的代码工作得很好。但是,我想知道如何将矩阵存储在堆内存中。该代码接受来自用户的3个正整数a,b和c。然后用户输入两个矩阵。第一个矩阵是n(行)乘m(列),第二个矩阵是m(行)乘p(列)。

矩阵乘积/输出是n行乘p列,例如; 示例输入

4

3

2

14 9 3

2 11 15

0 12 17

5 2 3

12 25 9 10

8 5

示例输出

273 455

243 235

244 205

102 160

int main(void) {
    int row1, row2, col1, col2, i, j, e;
    int temp, **matrix1, **matrix2, **mtxProduct;

    scanf("%d", &row1);
    scanf("%d", &col1);

    temp = col1;
    row2=temp;    
    scanf("%d", &col2);

    if (col1 != row2) {
        printf("\nIncorrect combination!\n");
        return 1;
    }

    matrix1 = (int**) malloc(row1 * sizeof(int*));

    //read elements of 1st matrix
    for (i = 0; i < row1; i++) {
        matrix1[i] = (int*) malloc(col1 * sizeof (int));
        for (j = 0; j < col1; j++) {
            scanf("%d %d %d\n", &matrix1[i][j], &matrix1[i][j], &matrix1[i][j]);
        }
    }

    matrix2 = (int**) malloc(row2 * sizeof (int*));

    //read elements of 2nd matrix
    for (i = 0; i < row2; i++) {
        matrix2[i] = (int*) malloc(col2 * sizeof (int));
        for (j = 0; j < col2; j++) {
            scanf("%d %d %d", &matrix2[i][j], &matrix2[i][j], &matrix2[i][j]);
        }
    }

    mtxProduct = (int**) malloc(row1 * sizeof (int*));

    for (i = 0; i < col2; i++) {
        mtxProduct[i] = (int*) malloc(col2 * sizeof (int));
    }

    for (i = 0; i < row1; i++) {
        for (j = 0; j < col2; j++) {
            mtxProduct[i][j] = 0;
            for (e = 0; e < row2; e++) {
                mtxProduct[i][j] +=(matrix1[i][e] * matrix2[e][j]);
            }
        }
    }

    for (i = 0; i < row1; i++) {
        for (j = 0; j < col2; j++) {
            printf("%d ", mtxProduct[i][j]);
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

如果你有一个现代的C编译器,从C99开始,它应该允许以下ideom

double (*A)[m] = malloc(sizeof(double[n][m]));

这样的事情是调用“可变修改类型”并带有必要的大小,因此编译器可以自行解决A[i][j]之类的问题。

如果你是纯粹主义者,你甚至可以这样做:

double (*A)[n][m] = malloc(sizeof *A);

随身携带*,例如(*A)[i][j]

当你不再需要时,不要忘记free最后的空格,free(A)在两种情况下都应该这样做。

答案 1 :(得分:0)

正如其他回答者所说,你需要使用malloc。我假设你的矩阵中的条目只能是int

int * allocate_matrix(int m, int n) {
  /* Returns an allocated m x n matrix */
  return malloc(sizeof(int) * m * n);
}

要访问矩阵,您需要确定是使用列主要还是行主要形式。在专栏形式中(由FORTRAN推广,在科学编程中最常见),您可以连续地一个接一个地存储每一列。要访问(2,3)处的条目,您可以使用指向矩阵的指针,例如A,并将其取消引用2*(number of columns) + 1。因此,对于m x n矩阵,它将是A[1+2*n] - 您从行和列号中取一个来计算0索引。

如果你想进入这种东西 - 它非常酷,诚实 - Google BLAS。