Гид по технологиям

Как умножать матрицы — понятное руководство

6 min read Математика Обновлено 17 Dec 2025
Как умножать матрицы — понятное руководство
Как умножать матрицы — понятное руководство

Математические иллюстрации на школьной доске

Что такое матрица

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

  • Размер (порядок) матрицы записывают как m × n, где m — число строк, n — число столбцов.
  • Элемент матрицы на пересечении i-й строки и j-го столбца обозначают a[i][j].

Условие совместимости для умножения

Чтобы перемножить две матрицы A (m × n) и B (n × p), число столбцов в A (= n) должно совпадать с числом строк в B (= n). При этом результат будет матрица размера m × p.

Важно: умножение матриц не коммутативно — в общем случае A·B ≠ B·A.

Пошаговый пример (числовой)

Рассмотрим конкретный пример: A размером 2×3 и B размером 3×2. Результат будет размером 2×2.

Иллюстрация умножения матриц

Пусть первая строка A — (1, 2, 3). Первая колонка B — (7, 9, 11).

Скалярное (точечное) произведение даёт элемент результирующей матрицы:

(1, 2, 3) • (7, 9, 11) = 1×7 + 2×9 + 3×11 = 58

Аналогично вычисляем остальные элементы:

(1, 2, 3) • (8, 10, 12) = 64

(4, 5, 6) • (7, 9, 11) = 139

(4, 5, 6) • (8, 10, 12) = 154

Итоговая матрица:

Результат умножения матриц

Алгоритм умножения матриц (псевдопошагово)

  1. Начать программу.
  2. Ввести число строк и столбцов первой матрицы (r1, c1).
  3. Ввести число строк и столбцов второй матрицы (r2, c2).
  4. Если c1 ≠ r2 — сообщить об ошибке и завершить.
  5. Ввести элементы первой матрицы m1[r1][c1].
  6. Ввести элементы второй матрицы m2[r2][c2].
  7. Создать результирующую матрицу mul[r1][c2] и инициализировать нулями.
  8. Для i от 0 до r1-1:
    • Для j от 0 до c2-1:
      • Для k от 0 до c1-1: mul[i][j] += m1[i][k] * m2[k][j]
  9. Вывести mul и завершить программу.

Реализация на C (пояснения и код)

В этом разделе показан компактный рабочий код на C. Код читает размеры и элементы матриц, проверяет совместимость, считает произведение и выводит результат. Обратите внимание: код использует динамику размера массивов (VLA), они доступны в современных компиляторах C99 и позже. Для переносимости можно заменить на динамическое выделение через malloc.

#include 
#include 

int main()
{
    int r1, r2, c1, c2;

    printf("Enter the number of rows for the first matrix:\n");
    scanf("%d", &r1);

    printf("Enter the number of columns for the first matrix:\n");
    scanf("%d", &c1);

    printf("Enter the number of rows for the second matrix:\n");
    scanf("%d", &r2);

    printf("Enter the number of columns for the second matrix:\n");
    scanf("%d", &c2);

    if (c1 != r2) {
        printf("The matrices cannot be multiplied together\n");
        exit(-1);
    }

    int m1[r1][c1], m2[r2][c2];
    printf("Enter the elements of the first matrix\n");

    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c1; j++) {
            scanf("%d", &m1[i][j]);
        }
    }

    printf("Enter the elements of the second matrix\n");

    for (int i = 0; i < r2; i++) {
        for (int j = 0; j < c2; j++) {
            scanf("%d", &m2[i][j]);
        }
    }

    int mul[r1][c2];

    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            mul[i][j] = 0;

            for (int k = 0; k < c1; k++) {
                mul[i][j] += m1[i][k] * m2[k][j];
            }
        }
    }

    printf("The multiplied matrix is: \n");

    for (int i = 0; i < r1; i++) {
        for (int j = 0; j < c2; j++) {
            printf("%d\t", mul[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Примечания к коду:

  • scanf с %d читает целые числа. Для чисел с плавающей точкой используйте %f и тип float/double.
  • VLA (Variable Length Arrays) удобны, но не поддерживаются во всех компиляторах по умолчанию. В таких случаях используйте malloc.
  • Обязательно инициализируйте результирующую матрицу нулями перед аккумуляцией.

Вывод программы — примеры экранов

Вывод результата умножения матриц

Если введены несовместимые размеры, программа должна сообщить об ошибке:

Сообщение об ошибке при невозможности умножения матриц

Когда умножение матриц не применимо

  • Если число столбцов первой матрицы не равно числу строк второй — умножение невозможно.
  • Если структура данных хранит нерегулярные строки (например, разная длина строк), сначала нужно привести данные к матричной форме.
  • Для некоторых приложений (сильная разреженность матриц) наивный алгоритм неэффективен — используются разрежённые форматы и специальные методы.

Альтернативные подходы и оптимизации

  • Стандартный алгоритм умножения даёт временную сложность O(n^3) для квадратных матриц. Для больших размеров используют алгоритмы типа Страссена или более продвинутые асимптотические методы, снижающие число операций при больших n.
  • Для разрежённых матриц применяют хранение в CSR/CSC форматах и умножение, обходя нулевые элементы.
  • Для задач с плавающей точкой и высокой производительностью используют библиотеки BLAS, LAPACK или матричные ускорители на GPU.
  • Параллелизация вложенных циклов (OpenMP, CUDA) даёт существенный выигрыш на многопроцессорных системах.

Ментальные модели и эвристики

  • Представляйте умножение как осмысленное сопоставление строк и столбцов: каждая строка A комбинируется с каждым столбцом B.
  • Если вам нужно применять линейное преобразование несколько раз, думайте о композиции матриц — умножение — это способ соединить преобразования.
  • Для проверки результата используйте маленькие примеры, где известен ответ (единичная матрица, нулевая, диагональная).

Критерии приёмки

  • Функция умножения возвращает корректный результат для нескольких тестовых случаев: случайная матрица, единичная матрица, нулевая матрица и диагональная матрица.
  • Проверка размеров (c1 == r2) проводится до чтения элементов второй матрицы.
  • Результирующая матрица инициализирована нулями до вычислений.
  • Для целочисленных входов результат соответствует точной целочисленной арифметике.
  • Для дробных входов проверяется погрешность (например, сравнением с допустимым эпсилоном).

Тестовые случаи и приёмочные критерии

  1. Малые матрицы 1×1, 1×n и n×1.
  2. Умножение любой матрицы на единичную матрицу (левая и правая) должно возвращать исходную матрицу.
  3. Умножение на нулевую матрицу даёт нулевую матрицу.
  4. Случай несовместимых размеров должен приводить к контролируемой ошибке/исключению.
  5. Проверка больших случайных матриц с библиотечной реализацией (например, NumPy) — согласованность результатов.

Рольовые чек-листы при разработке

Разработчик:

  • Убедиться, что ввод преобразован в корректные числовые типы.
  • Добавить проверку размеров до выделения больших структур.
  • Инициализировать результирующую матрицу.

Тестер:

  • Подготовить набор тестовых матриц (единичная, диагональная, разрежённая).
  • Запустить граничные тесты (максимальные размеры, нулевые значения).

DevOps/инженер производительности:

  • Протестировать параллельную версию и сравнить время с однопоточной.
  • Оценить память и заменить VLA на malloc, если требуется динамическое управление.

Примеры, где умножение матриц активно применяется

  • Компьютерная графика: преобразования координат (повороты, масштабирование, перенос).
  • Машинное обучение: операции над батчами данных и веса нейросетей.
  • Решение систем линейных уравнений и моделирование физических систем.
  • Криптография и кодирование сигналов.
  • Обработка изображений и сигнала.

Мини-методология для внедрения умножения матриц в проект

  1. Оцените требования: размеры матриц, плотность, точность чисел.
  2. Выберите представление: плотная (dense) или разрежённая (sparse).
  3. Реализуйте базовую проверяемую версию (наивный алгоритм).
  4. Напишите автотесты для корректности.
  5. Профилируйте; при необходимости оптимизируйте (параллелизация, библиотека).
  6. Документируйте ограничения и предположения.

Небольшая галерея крайних случаев

  • Крайне большие матрицы с малой плотностью — лучше использовать разрежённые структуры.
  • Матрицы с большими целыми числами — возможны переполнения, используйте типы с большим диапазоном или проверку.
  • Плавающая точка — аккуратность важна; последовательность операций влияет на погрешность.

Краткое резюме

Матрицы — универсальный инструмент. Умножение матриц выполняется по правилу совпадения количества столбцов первой матрицы и строк второй. На практике важно проверять размеры, инициализировать результат и выбирать подходящую реализацию в зависимости от размеров и плотности данных.

Important: если вам нужна реализация для больших данных или с плавающей точкой, рассмотрите готовые высокопроизводительные библиотеки (BLAS, LAPACK) или параллельную реализацию.

Дополнительно: диаграмма принятия решения

flowchart TD
  A[Есть две матрицы A и B] --> B{c1 == r2 ?}
  B -- Да --> C[Выполнить умножение A·B]
  B -- Нет --> D[Ошибка: несовместимые размеры]
  C --> E{Матрицы большие и плотные?}
  E -- Да --> F[Использовать BLAS / параллелизацию]
  E -- Нет --> G{Матрицы разрежённые?}
  G -- Да --> H[Использовать разрежённые форматы и алгоритмы]
  G -- Нет --> I[Наивный алгоритм O'n^3']

Контрольный список при внедрении в продукцию

  • Проверка входных размеров до выполнения.
  • Инициализация результирующей матрицы.
  • Обработка переполнений и ошибок ввода.
  • Набор юнит-тестов и тестов производительности.
  • Документация использованных алгоритмов и ограничений.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Скрыть или отключить расширения в Microsoft Edge
браузер

Скрыть или отключить расширения в Microsoft Edge

Управление уведомлениями мессенджеров
Мобильные

Управление уведомлениями мессенджеров

Ваш ПК не загрузился правильно — как исправить
Windows

Ваш ПК не загрузился правильно — как исправить

Исправление ошибки активации приложения при отключенном UAC
Windows

Исправление ошибки активации приложения при отключенном UAC

Настройка текста Splash в Minecraft
Игры

Настройка текста Splash в Minecraft

Как создать логотип в Kittl — 4 способа и чек-лист
Дизайн

Как создать логотип в Kittl — 4 способа и чек-лист