我正在尝试将两个多维数组相乘以形成矩阵。我有这个功能。这应该在理论上有效。但是,我只是得到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");
}
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 );
}
答案 0 :(得分:2)
你在做数学矩阵乘法吗?如果不是这样的话:
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]);
}
}
}
我的完整和最终解决方案,经过测试以产生合理的结果(我实际上并没有自己手动完成所有计算以检查它们)并且没有任何明智的细节,例如检查内存分配工作,是:
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;
}
在我的原始答案中,for循环的核心中有一些拼写错误,主要是由于我被一个不同的答案误导。这些已被后人纠正。
答案 1 :(得分:0)
如果您在代码中将c[i][j] = (a[i][k]) * (b[k][j]);
更改为c[i][j] += (a[i][k]) * (b[k][j]);
,那么只要
确保矩阵c以零启动。你可以在分配空间时使用calloc而不是malloc,或者在调用malloc之后memset分配的数组。
另一个提示是在访问数组元素时避免使用字母l
。累了的时候,你会很难注意到l
vs 1
的错误。