Вычисление произведения двух прямоугольных матриц в C/C++

Произведение прямоугольных матриц в C/C++
Для умножения прямоугольных матриц потребуется следующий алгоритм:
for(i = 0; i < N; i++) for(j = 0; j < M2; j++) { C[i][j] = 0; for(k = 0; k < M; k++) C[i][j] += A[i][k] * B[k][j]; }
N — кол-во строк матрицы A,
M — кол-во столбцов матрицы A,
M2 — кол-во столбцов матрицы B.
Рассмотрим пример программы
Для начала подключим необходимые библиотеки:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
Объявим константы для строк и столбцов матриц:
#define N 5 /* Число строк матрицы A*/
#define M 3 /* Число столбцов матрицы A*/
#define N2 3 /* Число строк матрицы B*/
#define M2 4 /* Число столбцов матрицы B*/
Используем функцию setlocale(); для кириллицы в консоли:
setlocale(0, "Russian");
Добавим проверку на возможность умножения матриц:
if (M != N2) {
printf("Нельзя умножать такие матрицы");
_getch();
return 0;
}
P.S. Число столбцов матрицы A должно быть равно кол-ву строк матрицы B
Динамически выделяем память под матрицы A, B, C:
// выделяем память для указателя на указатель
int *A = (int*)malloc(N * sizeof(int*));
int *B = (int*)malloc(N2 * sizeof(int*));
int *C = (int*)malloc(N * sizeof(int*));
// выделяем для каждой строки память
for (int i = 0; i < N; i++) {
A[i] = (int*)malloc(M * sizeof(int)); }
for (int i = 0; i < N2; i++) {
B[i] = (int*)malloc(M2 * sizeof(int)); }
for (int i = 0; i < N; i++) {
C[i] = (int*)malloc(M2 * sizeof(int)); }
Заполним матрицу A и матрицу B случайными числами.
Для этого используем функцию srand(time(NULL))
Для генерации псевдослучайных чисел используется функция rand(). Она генерирует числа на основе базы. Если базу не менять, последовательность псевдослучайных чисел будет одна и та же. Для установки базы генератора псевдослучайных чисел служит функция srand(). Ее аргумент — и есть значение базы. Сочетание srand(time(NULL)) устанавливает в качестве базы текущее время. Этот прием часто используется для того, чтобы при разных запусках генератора псевдослучайных чисел была всякий раз разная база и, соответственно, разный ряд получаемых значений.
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++) {
A[i][j] = rand() % 10;
}
for (int i = 0; i < N2; i++)
for (int j = 0; j < M2; j++) {
B[i][j] = rand() % 10;
}
rand() % 10 – берём остаток от деления на 10, следовательно элементы матрицы будут заполняться числами от 0 до 9.
Выполняем умножение матриц:
for(i = 0; i < N; i++)
for(j = 0; j < M2; j++) {
C[i][j] = 0;
for(k = 0; k < M; k++)
C[i][j] += A[i][k] * B[k][j];
}
Выводим произведение на экран:
printf("Матрица A\n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++){
printf("%d ", A[i][j]); }
printf("\n"); }
printf("\nМатрица B\n");
for (int i = 0; i < N2; i++) {
for (int j = 0; j < M2; j++){
printf("%d ", B[i][j]); }
printf("\n"); }
printf("\nРезультат умножения: \n");
for (int i = 0; i < N; i++) {
for (int j = 0; j < M2; j++){
printf("%3d ", C[i][j]); }
printf("\n"); }
Не забываем освобождать память:
for (int i = 0; i < N; i++) {
free(A[i]); }
for (int i = 0; i < N2; i++) {
free(B[i]); }
for (int i = 0; i < N; i++) {
free(C[i]); }
free(A);
free(B);
free(C);
Основано на этой статье
Помог? Оставляй комментарий!