在C中乘以两个数组
我想将两个多维数组相乘以形成一个矩阵。我有这个功能。这应该在理论上起作用。但是,我只是得到0和大/笨拙的数字。有人可以帮我弄这个吗?在C中乘以两个数组
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);
}
你在做数学矩阵乘法吗?如果是的话它不应该是:
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;
}
有几个错别字的在我原来的答复为核心的循环,主要是因为我被一个不同的答案误导。这些已被后人纠正。
不错的猜测,但它并没有解决问题。我注意到** a和** b是NULL。我试图malloc他们,就像我用** c做的,但它似乎没有工作 – 2010-12-10 12:40:13
错误你的意思是** ** == NULL? NULL = 0,所以这意味着'a [0] [0] == 0'。那么如果数组左上角的元素为零呢?如果'a == NULL',那么你应该得到一个分段错误。 – AlastairG 2010-12-10 12:46:41
那么,当我把这个片段放入我的3rd for循环中。 如果(A [1] [k]的== 0){ \t \t \t \t \t \t \t \t的printf( “* A * NULL \ n”); }它打印出来。 – 2010-12-10 12:54:29
如果你在你的代码更改c[i][j] = (a[i][k]) * (b[k][j]);
到c[i][j] += (a[i][k]) * (b[k][j]);
那么它会工作得很好,只要
- NR1是矩阵
- NC1的行数是矩阵 的列数
- nc2是矩阵b的列数
只要确保矩阵c以零开始。您可以在分配空间时使用calloc而不是malloc,或者在调用malloc之后memset分配的数组。
还有一个技巧是在访问数组元素时避免使用字母l
。当累了的时候,你会很难注意到l
与1
之间的错误。
一个main()和一些示例矩阵的最小示例将得心应手 – Spacedman 2010-12-10 12:12:20
与您的问题并不真正相关,但是当malloc失败时,您不应该仅仅打印“Insuff mem”,您应该至少停止使用未分配的空间。 – buddhabrot 2010-12-10 12:22:36
@ user373466,我已经花了更多的时间在这方面比我应该有。一票或两票和接受将不胜感激。 – AlastairG 2010-12-10 14:27:19