下面我的代码工作得很好。但是,我想知道如何将矩阵存储在堆内存中。该代码接受来自用户的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;
}
答案 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。