Умножение матриц си++

Я заметил, что у меня функция пропускает последнюю строку, если матрица не квадратная при умножении. Ошибку пока не вижу, поэтому прошу помочь.

void multiplication(int (&a1)[4][4], int (&b)[4][4], int (&c)[4][4], int n, int l){
    for (int i=0; i<n; i++){
        for (int j=0; j<l; j++){
            for(int k=0; k<n; k++){
                int save = a1[i][k]*b[k][j];
                c[i][j] += save;
                save = 0;
            }
        }
    }
}

Условие для умножения матриц (количество строк одной=количество столбцов второй) проверяется в другой функции.


Ответы (1 шт):

Автор решения: Павел Ериков

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

При умножении матрицы 3 на 4 с 4 на 2 заметьте, что у вас 3 числа это 3, 4, 2, а ваша функция на данный момент может узнать только о двух из них.

Вот правильный пример вашей функции:

//row1 - кол-во строк в матрице a1, col1 - кол-во столбцов в 1 
матрице, col2 - кол-во столбвоц во 2 матрице
void multiplication(int(&a1)[4][4], int(&b)[4][4], int(&c)[4][4], int row1, int col1, int col2) {
    for (int i = 0; i < row1; i++) {
        for (int j = 0; j < col2; j++) {
            c[i][j] = 0;
            for (int k = 0; k < col1; k++)
                c[i][j] += a1[i][k] * b[k][j];
        }
    }
}

Для большего понимания, я переименовал переменные и подписал в комментарии, что они обозначают.

Теперь чтобы умножить матрицу 3 на 4 и 4 на 2 нужно вызывать функцию так:

multiplication(a, b, c, 3, 4, 2);
→ Ссылка