#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.