Ошибка умножения матрицы после цикла в языке c - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть задание, где я должен сделать программу умножения матриц более эффективной поэтому я написал метод, называемый матрицей умножения, но после того, как я на самом деле выполняю умножение матриц в цикле, матрица конечного продукта будет равна нулю, но, если я проверю, находясь в цикле, она не равна нулю

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;

}

1 Ответ

0 голосов
/ 26 апреля 2018

Обнаружены две ошибки:

Вы не сбрасываете 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;
}
...