c语言循环后矩阵乘法错误

matrix multiplication error after loop in c language

我有一个任务,我必须使矩阵乘法程序更高效 所以我写了一个叫做乘法矩阵的方法,但是在我实际在循环中进行矩阵乘法之后,最终乘积矩阵全为零但是,如果我在循环中检查 while 它不为零

int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
    printf("error\n");
    return NULL;
}

int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));



for(i = 0; i<m1; i++){
    product[i] = (int*) malloc(n2 * sizeof(int));
    for(j = 0; j<n1; j++){
        product[i][j] = 0;
    }
}
*
for(i = 0; i < m1; i ++) {
    product[i] = (int*) malloc(n2 * sizeof(int));
    int chg = 0;

     while(j<n2){


        if(k == n1 ){
            //chg = 0;
            k = 0;
            //printf("%d\n", j);
            j++;
        }

             product[i][j]  += matrix1[i][k] * matrix2[k][j];

            printf("%d \n", product[i][j]);
        k++;
        chg = 1;

    }
}

return product;

}

我发现了两个错误:

您没有在外部乘法循环中重置 j = 0。这导致它只完成一行,如果它完全进入内部循环,因为它的值在分配循环之后仍然等于 n1。这很可能就是它为您返回全零的原因。

其次,你也应该在外循环中重置k。当条件 j<n2 被打破时,i 递增,但 k 保持与上一个循环结束时相同的值。

我也不知道 chg 变量的作用是什么,因为它什么都不做。

而且,正如 TrustworthySystems 所说,只分配一次内存,否则就会发生泄漏。这是正确的函数:

int** multiply_matrices(int** matrix1, int** matrix2, int m1, int n1, int m2, int n2) {
if(n1 != m2) {
    printf("error\n");
    return NULL;
}

int i = 0;
int j = 0;
int k = 0;
int** product = (int**) malloc(m1 * sizeof(int*));



for(i = 0; i<m1; i++){
    product[i] = (int*) malloc(n2 * sizeof(int));
    for(j = 0; j<n1; j++){
        product[i][j] = 0;
    }
}

for(i = 0; i < m1; i++) {
    int chg = 0;
    j = 0;
    k = 0;

    while(j<n2){
        if(k == n1 ){
            k = 0;
            j++;
        }
        product[i][j]  += matrix1[i][k] * matrix2[k][j];
        k++;
        chg = 1;

    }
}
return product;
}