如何使用指针与矩阵相乘-C
我得写一个程序,用指针乘以矩阵。 我的程序运行正确,但存在两个问题: 1) 我只能做一个乘法运算——当我想做下一个乘法运算时,就会出现错误 2) 当我输入第一个和第二个矩阵的数据时,我必须再输入一个 char使我的程序工作 为了解决这些问题,我应该在代码中更改什么如何使用指针与矩阵相乘-C,c,pointers,matrix,matrix-multiplication,C,Pointers,Matrix,Matrix Multiplication,我得写一个程序,用指针乘以矩阵。 我的程序运行正确,但存在两个问题: 1) 我只能做一个乘法运算——当我想做下一个乘法运算时,就会出现错误 2) 当我输入第一个和第二个矩阵的数据时,我必须再输入一个 char使我的程序工作 为了解决这些问题,我应该在代码中更改什么 #include <stdio.h> #include <stdlib.h> while (z--) { // the number of sets scanf ("%d
#include <stdio.h>
#include <stdlib.h>
while (z--) { // the number of sets
scanf ("%d %d", &n1, &m1); // first matrix n1 x m1
int **A = malloc(n1 * sizeof(int*));
for (i = 0; i < n1; i++) {
*(A+i) = malloc(m1 * sizeof(int));
}
for (i = 0; i < n1; i++) {
for (j = 0; j < m1; j++) {
scanf("%d ", (A+i*m1+j));
}
}
scanf("%d %d", &n2, &m2); // second matrix n2 x m2
int **B = malloc(n2 * sizeof(int*));
for (i = 0; i < n2; i++) {
*(B+i) = malloc(m2 * sizeof(int));
}
for (i = 0; i < n2; i++) {
for (j = 0; j < m2; j++) {
scanf("%d ", (B+i*m2+j));
}
}
if (m1 != n2) {
printf ("ERROR\n");
} else {
int **C = malloc(n1 * sizeof(int*)); //matrix with product
for (i = 0; i < n1; i++) {
*(C+i) = malloc(m2 * sizeof(int));
}
for (i=0; i<n1; i++) {
for (j=0; j<m2; j++) {
*(C+i*m2+j) = 0;
}
}
for (k = 0; k < n2; k++) {
for (i = 0; i < n1; i++) {
for (j = 0; j < m2; j++) {
C1 = 0;
A1 = *(A+i*m1+k);
B1 = *(B+k*m2+j);
C1 = (C1+A1*B1)%1000;
temp = *(C+i*m2+j);
*(C+i*m2+j) = temp+C1;
}
}
}
for (i = 0; i < n1; i++) {
for (j = 0; j < m2; j++) {
printf("%d ", *(C+i*m2 +j));
}
printf("\n");
}
for (i = 0; i < n1; i++) { // free third matrix
free(*(C+i));
}
free(C);
}
for (i = 0; i < n1; i++) { // free first matrix
free(*(A+i));
}
free(A);
for (i = 0; i < n2; i++) { // free second matrix
free(*(B+i));
}
free(B);
}
return 0;
#包括
#包括
而(z-){//集合数
scanf(“%d%d”,&n1,&m1);//第一个矩阵n1 x m1
int**A=malloc(n1*sizeof(int*);
对于(i=0;i 对于(i=0;i您写入内存的大小超过了分配的大小。这会调用未定义的行为,这是对您观察到的不稳定行为的一个很好的解释
违规代码如下:
for (k=0; k<n2; k++){
for (i=0; i<n1; i++) {
for (j=0; j<m2; j++) {
C1=0;
A1=*(A+i*m1+k);
B1=*(B+k*m2+j);
C1=(C1+A1*B1)%1000;
temp=*(C+i*m2+j);
*(C+i*m2+j)=temp+C1;
}
}
}
不清楚为什么要计算模1000
。如果你真的是这个意思,你应该使用这个:
C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % 1000;
如果您不应该使用[]
语法,请将其替换为指针解引用的等效语法,而不是2D数组寻址。我理解他们试图教您的内容,但图表会比这更有效
*(*(C+i)+j) = (*(*(C+i)+j) + *(*(A+i)+k) * *(*(B+k)+j)) % 1000;
正如您可能已经注意到的,2D数组和指向数组的指针数组的[]
语法是相同的,但为指针算术和解引用生成的代码却大不相同
您还需要在其他地方更改索引方法,以下是更正的代码:
while (z--) { // the number of sets
scanf("%d %d", &n1, &m1); // first matrix n1 x m1
int **A = malloc(n1 * sizeof(int*));
for (i = 0; i < n1; i++) {
*(A+i) = malloc(m1 * sizeof(int));
for (j = 0; j < m1; j++) {
scanf("%d ", *(A+i)+j);
}
}
scanf("%d %d", &n2, &m2); // second matrix n2 x m2
int **B = malloc(n2 * sizeof(int*));
for (i = 0; i < n2; i++) {
*(B+i) = malloc(m2 * sizeof(int));
for (j = 0; j < m2; j++) {
scanf("%d ", *(B+i)+j);
}
}
if (m1 != n2) {
printf ("ERROR\n");
} else {
int **C = malloc(n1 * sizeof(int*)); //matrix with product
for (i = 0; i < n1; i++) {
// using calloc so matrix is initialized to 0
*(C+i) = calloc(m2, sizeof(int));
}
for (k = 0; k < n2; k++) {
for (i = 0; i < n1; i++) {
for (j = 0; j < m2; j++) {
*(*(C+i)+j) = (*(*(C+i)+j) + *(*(A+i)+k) * *(*(B+k)+j)) % 1000;
}
}
}
for (i = 0; i < n1; i++) {
for (j = 0; j < m2; j++) {
printf("%d ", *(*(C+i)+j));
}
printf("\n");
}
for (i = 0; i < n1; i++) { // free third matrix
free(*(C+i));
}
free(C);
}
for (i = 0; i < n1; i++) { // free first matrix
free(*(A+i));
}
free(A);
for (i = 0; i < n2; i++) { // free second matrix
free(*(B+i));
}
free(B);
}
return 0;
while(z--){//
scanf(“%d%d”,&n1,&m1);//第一个矩阵n1 x m1
int**A=malloc(n1*sizeof(int*);
对于(i=0;i
你能发布丢失的代码吗?我们看不到你如何调用当前片段,尤其是多次调用。首先,你必须通过添加函数定义和所需变量使代码可编译。语法*(A+i)
比其等价的A[i]
可读性差得多,原因是我不能使用“[”和“]“-这是问题中的一个要求。而且乘法后矩阵中的数字可能很大,因此我们必须使用%1000@lotheof如果你不能使用某些东西,那么在你的问题中说明。我们不是读心术的人。好的,对不起,这是我的第一个问题。@chqrlie我在你写的时候编辑了我的代码,但我仍然有相同的代码problems@lotheof:你会吗u将修改后的代码发布到粘贴箱?请不要修改发布的代码语义。您仍然存在问题的原因是,您没有在use实施2D数组地址计算的其他地方解决寻址问题。
while (z--) { // the number of sets
scanf("%d %d", &n1, &m1); // first matrix n1 x m1
int **A = malloc(n1 * sizeof(int*));
for (i = 0; i < n1; i++) {
*(A+i) = malloc(m1 * sizeof(int));
for (j = 0; j < m1; j++) {
scanf("%d ", *(A+i)+j);
}
}
scanf("%d %d", &n2, &m2); // second matrix n2 x m2
int **B = malloc(n2 * sizeof(int*));
for (i = 0; i < n2; i++) {
*(B+i) = malloc(m2 * sizeof(int));
for (j = 0; j < m2; j++) {
scanf("%d ", *(B+i)+j);
}
}
if (m1 != n2) {
printf ("ERROR\n");
} else {
int **C = malloc(n1 * sizeof(int*)); //matrix with product
for (i = 0; i < n1; i++) {
// using calloc so matrix is initialized to 0
*(C+i) = calloc(m2, sizeof(int));
}
for (k = 0; k < n2; k++) {
for (i = 0; i < n1; i++) {
for (j = 0; j < m2; j++) {
*(*(C+i)+j) = (*(*(C+i)+j) + *(*(A+i)+k) * *(*(B+k)+j)) % 1000;
}
}
}
for (i = 0; i < n1; i++) {
for (j = 0; j < m2; j++) {
printf("%d ", *(*(C+i)+j));
}
printf("\n");
}
for (i = 0; i < n1; i++) { // free third matrix
free(*(C+i));
}
free(C);
}
for (i = 0; i < n1; i++) { // free first matrix
free(*(A+i));
}
free(A);
for (i = 0; i < n2; i++) { // free second matrix
free(*(B+i));
}
free(B);
}
return 0;