用C语言将两个数组相乘
我试图将两个多维数组相乘,形成一个矩阵。我有这个功能。这在理论上应该是可行的。然而,我只是得到了0和大/尴尬的数字。有人能帮我吗用C语言将两个数组相乘,c,C,我试图将两个多维数组相乘,形成一个矩阵。我有这个功能。这在理论上应该是可行的。然而,我只是得到了0和大/尴尬的数字。有人能帮我吗 int **matrix_mult( int **a, int **b, int nr1, int nc1, int nc2 ) { int **c; int i,j,k,l; c = malloc(sizeof(int *)*nr1); if (c == NULL){ printf("Insuff memm");
int **matrix_mult( int **a, int **b, int nr1, int nc1, int nc2 )
{
int **c;
int i,j,k,l;
c = malloc(sizeof(int *)*nr1);
if (c == NULL){
printf("Insuff memm");
}
for(l=0;l<nr1;l++){
c[l] = malloc(sizeof(int)*nc1);
if (c[l] == NULL){
printf("Insuff memm");
}
}//for loop
for (i=0;i<nr1;i++){
for (j=0;j<nc2;j++){
for (k=0;k<nc1;k++){
c[i][j] = (a[i][k]) * (b[k][j]);
}
}
}
return( c );
}
int**matrix\u mult(int**a,int**b,int nr1,int nc1,int nc2)
{
int**c;
int i,j,k,l;
c=malloc(sizeof(int*)*nr1);
如果(c==NULL){
printf(“inuff memm”);
}
对于(l=0;l你在做数学矩阵乘法吗?如果是这样,它不应该是:
for(i = 0; i < nr1; i++)
{
for(j = 0; j < nc1; j++)
{
c[i][k] = 0;
for(k = 0; k < nc2; k++)
{
c[i][k] += (a[i][j]) * (b[j][k]);
}
}
}
(i=0;i
{
对于(j=0;j
我的完整和最终解决方案经过测试,能够产生合理的结果(我并没有亲自手动进行所有计算来检查它们),并且没有任何合理的细节,例如检查内存分配工作,它是:
int **matrix_mult(int **a, int **b, int nr1, int nc1, int nc2)
{
int **c;
int i, j, k;
c = malloc(sizeof(int *) * nr1);
for (i = 0; i < nr1; i++)
{
c[i] = malloc(sizeof(int) * nc2);
for (k = 0; k < nc2; k++)
{
c[i][k] = 0;
for (j = 0; j < nc1; j++)
{
c[i][k] += (a[i][j]) * (b[j][k]);
}
}
}
return c;
}
int**matrix\u mult(int**a,int**b,int nr1,int nc1,int nc2)
{
int**c;
int i,j,k;
c=malloc(sizeof(int*)*nr1);
对于(i=0;i
在我最初的答案中,for循环的核心部分有一些拼写错误,主要是因为我被不同的答案误导了。这些错误已经为后代纠正了。如果你在你的代码中更改
c[i][j]=(a[i][k]*(b[k][j]);
到c[i][j]+=(a[i][k]*(b[k][j];
,那么只要
- nr1是矩阵a的行数
- nc1是矩阵a的列数
- nc2是矩阵b的列数
还有一个技巧是在访问数组元素时避免使用字母
l
。当您感到疲劳时,您将很难注意到l
vs1
的错误。一个带有main()和一些示例矩阵的最小示例与您的问题没有真正的关系,而不仅仅是打印“inuff mem”当malloc失败时,您至少应该停止使用未分配的空间做任何事情。@user373466,我在这方面花的时间比我应该花的时间多。请投一两票并接受。当代码明显被破坏时,“这在理论上应该行得通。”这是一个大胆的说法!你是说你的代码是对的,编译器坏了吗?这不是最有可能的解释。猜得好,但它并没有解决问题。我注意到**a和**b是空的。我试图对它们进行malloc处理,就像我对**c所做的那样,但它似乎不起作用。你的意思是**a==NULL
?NULL=0等等意思是a[0][0]==0
。那么,如果数组的左上角元素为零呢?如果a==NULL
,那么你应该得到一个分段错误。好吧,当我把这个片段放在我的第三个for循环中时。if(a[I][k]==0){printf(“a NULL\n”);}它被打印出来了。你的第一个数组有零元素吗?如果没有,我会很惊讶的!我刚刚更新了c+=a*b行,因为它是错误的。我从Buddhabrot复制的,他弄错了。