c语言,两矩阵相乘问题

#include<stdio.h>
void main()
{
int a[20][20]={0};
int b[20][20]={0};
int i,j,k,n1,m1,n2,m2;
printf("矩阵a行数:");
scanf("%d",&n1);
printf("矩阵a列数:");
scanf("%d",&m1);
printf("输入矩阵a元素\n");
for(i=0;i<n1;i++)
for(j=0;j<m1;j++)
{
scanf("%d",&a[i][j]);
}
printf("矩阵b行数:");
scanf("%d",&n2);
while(n2!=m1)
{
printf("输入错误,重新输入");
printf("矩阵b行数:");
scanf("%d",&n2);
}
printf("矩阵b列数:");
scanf("%d",&m2);
printf("输入矩阵b元素\n");
for(i=0;i<n2;i++)
for(j=0;j<m2;j++)
{
scanf("%d",&b[i][j]);
}
int (*p)[20];
int (*q)[20];
p=a;
q=b;
int s[20][20]={0};
for(i=0;i<n1;i++)
for(j=0;j<m2;j++)
for(k=0;k<m1;k++)
{
s[i][j]+=(*p[i]+k)*(*q[k]+j);
}
for(i=0;i<n1;i++)
{
for(j=0;j<m2;j++)
{
printf("%d ",s[i][j]);
}
printf("\n");
}
}
算出来就是数值不对,但是有时候又是对的,求指教

没有细看,是不是维数问题。
给你一个程序,计算:
a[a_row][a_col] * b[b_row][b_col]=c[a_row][b_col]
注意 b_row==a_col
DEBUG 为 1 输出中间结果,方便查错。 可以改为 0。
动态分配数组。
含输入例子。
#include<stdio.h>
#include <stdlib.h>
#define DEBUG 1
void show_array(int *a, int row,int col);
/*---------------------
c[j]][i] = a[j][k] * b[k][i] = c[j][i]
a[c_row][nk]: a[3][2]={1,2,3,4,5,6}
b[nk][c_col]: b[2][3]={1,2,3,4,5,6}
c[c_row][c_col]: c[3][3]={9,12,15,19,26,33,29,40,51}
*---------------------*/
void matrix2(int *a,int *b, int *c, int a_row, int b_col, int b_row)
{
int i,j,k;
int a_col,c_row,c_col;
a_col=b_row; c_row=a_row; c_col=b_col;
if (DEBUG==1){
printf("A[%d][%d]:\n",a_row,a_col);
show_array(a,a_row,a_col);
printf("B[%d][%d]:\n",b_row,c_col);
show_array(b,b_row,b_col);
};
for(j=0;j<c_row;j++){
for(i=0;i<c_col;i++){
c[j*c_col+i]=0;
for(k=0;k<a_col;k++) c[j*c_col+i]+= a[j*a_col+k] * b[k*b_col+i];
};
};
}

main()
{
int i,j,k,tmp;
int a_row,a_col,b_row,b_col,c_row,c_col;
int *a,*b,*c;
printf("please enter a_row a_col of matrix_A: 3 2\n");
scanf("%d %d",&a_row,&a_col);
b_row = a_col;
printf("please enter b_col of matrix_B: 3\n");
scanf("%d",&b_col);
c_row = a_row;
c_col = b_col;

a = (int *) malloc(sizeof(int *) * a_row * a_col);
b = (int *) malloc(sizeof(int *) * b_row * b_col);
c = (int *) malloc(sizeof(int *) * c_row * c_col);

if (!c) { printf("no enought memory for alloc\n");return 0; }

printf("Please input int matrix a[%d][%d] 1 2 3 4 5 6\n",a_row,a_col);
for (j=0;j<a_row;j++)
for (i=0;i<a_col;i++){
scanf("%d",&tmp);
a[j*a_col+i] = tmp;
}
printf("Please input int matrix b[%d][%d] 1 2 3 4 5 6\n",b_row,b_col);
for (j=0;j<b_row;j++)
for (i=0;i<b_col;i++){
scanf("%d",&tmp);
b[j*b_col+i] = tmp;
}
if (DEBUG==1){
printf("A[%d][%d]:\n",a_row,a_col);
show_array(a,a_row,a_col);
printf("B[%d][%d]:\n",b_row,c_col);
show_array(b,b_row,b_col);
};
matrix2( a,b,c, a_row, b_col, b_row);
show_array(c,c_row,c_col);
free(a);free(b);free(c);
return 0;
}
void show_array(int *a, int row,int col)
{
int i,j;
for (j=0;j<row;j++){
for (i=0;i<col;i++) printf("%d ",a[j*col+i]);
printf("\n");
}
printf("--------------------\n");
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-07-21
把s[i][j]+=(*p[i]+k)*(*q[k]+j);改成s[i][j]+=*(p[i]+k)**(q[k]+j);……追问

真的好了,可以解释一下吗,谢谢

追答

p[i]是第i行第0个元素的指针,p[i]+k就是第i行第k个元素的指针,*(p[i]+k)就是第i行第k个元素的值;它和另一个矩阵q的第k行第j个元素的值*(q[k]+j)相乘、再与s[i][j]相加后赋给s[i][j]才对呀!

本回答被提问者采纳
相似回答