Как мне решить эту проблему с умножением двух матриц?

#c #matrix #multidimensional-array #matrix-multiplication

#c #матрица #многомерный массив #матрица-умножение

Вопрос:

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

 int main() {
    ...
    else if (multiplication == true){
        if (columnsA == rowsB amp;amp; rowsA == columnsB){
            for(int i = 0; i < rowsA; i  ){
                for(int j = 0; j < columnsB   1; j  ){
                    for(int k = 0; k < columnsA; k  ){
                        C[i][j] = C[i][j]   A[i][k] * B[k][j];
                    }
                } 
            }
        }
        else{
            printf("nError: The number of columns in Matrix A must be equal to the number of rows in Matrix B for multiplication");
            return 1;
        }
    }
    ...

return 0;
}
 

A является первой матрицей, B является второй матрицей и C является результатом. rowsA — это количество строк в матрице A , а столбцов B — количество столбцов matrixB в.

Код работает для первых чисел в выходной матрице, но последнее число всегда оказывается очень длинным случайным числом.

Например, входными данными будет 2x2 матрица со следующими значениями: Строка 1: 3 1 Строка 2: 5 2

и еще 2x2 одна матрица со следующими значениями

 row 1: 4 1
row 2: 2 6
 

Вывод получается в виде

 row 1: 14 9
row 2: 24 -374793898(or some other long, random number)
 

Первые три числа правильные (я проверил), но последнее никогда не бывает правильным.

Комментарии:

1. Код кажется правильным. Мне кажется, что вы неправильно заполняете одну из матриц (A, B и / или C) перед их умножением

2. Обратите внимание, что тест rowsA == columsB бесполезен. Матрица C не обязана быть квадратной

Ответ №1:

    else if (multiplication == true){
        if (columnsA == rowsB amp;amp; rowsA == columnsB){
            for(int i = 0; i < rowsA; i  ){
                for(int j = 0; j < columnsB   1; j  ){
                    for(int k = 0; k < columnsA; k  ){
                        C[i][j] = C[i][j]   A[i][k] * B[k][j];
                    }
                } 
            }
        }
 

Ваш код умножения считывает значения из матриц C , A и B . Матрицы A и B считываются из файла, однако вы забыли инициализировать матрицу C нулями (т.Е. int C[5][5] = {0}; ). В противном случае матрица C будет содержать случайные значения. И эти случайные значения будут добавлены к матрицам A и B во время операции C[i][j] = C[i][j] A[i][k] * B[k][j]; .

Кроме того, измените columnsB 1 на columnsB , в for(int j = 0; j < columnsB 1; j ) . В противном случае вы выходите за границы матрицы C и B , отмеченные в следующем коде символом «^»:

  for(int j = 0; j < columnsB   1; j  )
    for(int k = 0; k < columnsA; k  )
        C[i][j] = C[i][j]   A[i][k] * B[k][j];
                      ^^^                 ^^^
 

Ответ №2:

Я думаю, что основной причиной является эта строка

 for(int j = 0; j < columnsB   1; j  ){
 

1 заставляет вас выйти за пределы матрицы 5×5

Также вам действительно нужно инициализировать матрицу C равным 0.

Ответ №3:

Я думаю, вы должны сделать это,

Инициализируйте c[5][5] с 0.