首页 > 解决方案 > c语言循环后矩阵乘法错误

问题描述

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

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;

}

标签: cmatrix-multiplication

解决方案


我发现了两个错误:

您没有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;
}

推荐阅读