В данной статье мы рассмотрим алгоритм умножения матриц и приведем его код на языке программирования С.
Умножать можно такие прямоугольные матрицы, в которых число столбцов первой матрицы равно числу строк во второй (про такие матрицы говорят, что их форма согласована), то есть их размерность должна быть следующая: матрица A[m, n], матрица B[n, q].
В результате умножения получится матрица C[m, q]:
элементы которой находятся по формуле:
На языке C алгоритм умножения матриц может быть записан следующим образом:
1 2 3 4 5 6 7 |
for(i = 0; i < m; i++) for(j = 0; j < q; j++) { C[i][j] = 0; for(k = 0; k < n; k++) C[i][j] += A[i][k] * B[k][j]; } |
Рассмотрим пример программы, которая умножает две квадратные матрицы размерностью N, заполненные случайными числами.
Подключим необходимые библиотеки к программе:
1 2 3 |
#include <stdio.h> #include <stdlib.h> #include <time.h> |
Объявим константу число N — размерность матриц:
1 |
#define N 3 |
Переходим к функции main(). Вначале необходимо выделить память под матрицы A, B и C:
1 2 3 4 5 6 7 8 9 |
int **A = (int**)malloc(N * sizeof(int*)); int **B = (int**)malloc(N * sizeof(int*)); int **C = (int**)malloc(N * sizeof(int*)); for (i = 0; i < N; i++) { A[i] = (int*)malloc(N * sizeof(int)); B[i] = (int*)malloc(N * sizeof(int)); C[i] = (int*)malloc(N * sizeof(int)); } |
Заполним матрицы A и B случайными числами.
srand(time(NULL)) — инициализация генератора случайных текущим временем компьютера.
rand() % 10 — берём остаток от деления на 10, следовательно элементы матрицы будут заполняться числами от 0 до 9.
1 2 3 4 5 6 7 |
srand(time(NULL)); for (i = 0; i < N; i++) for (j = 0; j < N; j++) { A[i][j] = rand() % 10; B[i][j] = rand() % 10; } |
Выполняем умножение матриц:
1 2 3 4 5 6 7 |
for(i = 0; i < N; i++) for(j = 0; j < N; j++) { C[i][j] = 0; for(k = 0; k < N; k++) C[i][j] += A[i][k] * B[k][j]; } |
Выводим результат вычислений на экран:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
printf("matrix A\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%d ", A[i][j]); printf("\n"); } printf("\nmatrix B\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%d ", B[i][j]); printf("\n"); } printf("\nthe result of multiplying\n"); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf("%3d ", C[i][j]); printf("\n"); } |
Не забываем прибираться за собой. Освобождаем память:
1 2 3 4 5 6 7 8 9 |
for (i = 0; i < N; i++) { free(A[i]); free(B[i]); free(C[i]); } free(A); free(B); free(C); |
Результат работы программы представлен на рисунке ниже:
Если вы хотите скачать исходник этой программы, но нажмите на кнопку.
Скачать исходник
Поделиться в соц. сетях:
Отличная статья, спасибо!
Это скорее С++, а не С.
Справедливо. В языке Си нет операторов new и delete. Переписал программу, используя СИшные malloc и free.