Умножение матриц разной размерности в Excel: полное руководство

Умножение матриц в Microsoft Excel — задача, с которой сталкиваются студенты, инженеры и аналитики данных. Но что делать, если размерности матриц не совпадают? Классическое матричное умножение требует, чтобы количество столбцов первой матрицы равнялось количеству строк второй. Однако в реальных расчётах часто возникают ситуации, когда нужно перемножить матрицы 3×2 и 2×4, или даже 4×1 (вектор-столбец) на 1×3 (вектор-строку). В этой статье разберём все возможные сценарии — от стандартных функций до пользовательских решений на VBA.

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

Если вы никогда не работали с матрицами в Excel, начните с простого: проверьте, совпадает ли количество столбцов первой матрицы с количеством строк второй. Например, матрицу А (2×3) можно умножить на матрицу В (3×2), но не наоборот. Если размерности не подходят, придётся использовать обходные пути — и именно их мы подробно разберём ниже.

1. Стандартное умножение матриц: функция МУМНОЖ

Базовый инструмент для матричных вычислений в Excel — функция МУМНОЖ (или MMULT в английской версии). Она работает только при соблюдении условия совместимости размерностей: если первая матрица имеет размер m×n, то вторая должна быть n×k. Результат будет матрицей m×k.

Пример: умножим матрицу А (2×3) на матрицу В (3×2). Для этого:

  1. Введите матрицу А в диапазон A1:C2.
  2. Введите матрицу В в диапазон E1:F3.
  3. Выделите диапазон для результата (например, H1:I2 — 2 строки и 2 столбца).
  4. Введите формулу =МУМНОЖ(A1:C2; E1:F3) и нажмите Ctrl+Shift+Enter (это формула массива!).

Если вы увидели ошибку #ЗНАЧ!, скорее всего, нарушено условие совместимости размерностей. Например, попытка умножить 3×2 на 3×3 приведёт к ошибке, потому что количество столбцов первой матрицы (2) не равно количеству строк второй (3).

2. Умножение матриц с несовпадающими размерностями: обходные пути

Когда размерности матриц не совпадают, стандартная функция МУМНОЖ бесполезна. Но есть несколько способов обойти это ограничение:

Способ 1: Транспонирование матриц

Если вам нужно умножить А (m×n) на В (k×l), где n ≠ k, попробуйте транспонировать одну из матриц. Например, умножение А (2×3) на В (4×2) невозможно, но если транспонировать В (получится 2×4), то умножение А × В станет возможным (результат 2×4).

Способ 2: Использование псевдообратной матрицы

Для квадратных матриц можно использовать функцию МОБР (обратная матрица), но если матрица не квадратная, потребуется псевдообратная матрица (например, с помощью формулы =МУМНОЖ(МОБР(МУМНОЖ(ТРАНСП(А);А));ТРАНСП(А))). Это позволяет "приближённо" решать системы уравнений с несовпадающими размерностями.

Способ 3: Дополнение матриц нулями

Если разница в размерностях небольшая, можно дополнить меньшую матрицу нулевыми строками или столбцами. Например, чтобы умножить 3×2 на 4×3, дополните первую матрицу до 3×4 нулевыми столбцами.

📊 Какой метод умножения матриц вы используете чаще?
Стандартную функцию МУМНОЖ
Транспонирование
Псевдообратные матрицы
Дополнение нулями
Собственный скрипт на VBA

3. Умножение вектора на матрицу (и наоборот)

Частный случай несовпадающих размерностей — умножение вектора (матрицы 1×n или n×1) на матрицу. Здесь важно правильно определить, где вектор-строка, а где вектор-столбец.

Пример 1: Умножение вектора-строки (1×3) на матрицу (3×2).

  1. Вектор введите в A1:C1.
  2. Матрицу введите в A3:B5.
  3. Формула: =МУМНОЖ(A1:C1; A3:B5) (результат — 1×2).

Пример 2: Умножение матрицы (2×3) на вектор-столбец (3×1).

  1. Матрицу введите в A1:C2.
  2. Вектор введите в E1:E3.
  3. Формула: =МУМНОЖ(A1:C2; E1:E3) (результат — 2×1).

Критическая ошибка: если перепутать вектор-строку и вектор-столбец, Excel выдаст #ЗНАЧ!, даже если размерности кажутся совместимыми. Всегда проверяйте ориентацию вектора!

4. Умножение матриц через Power Query (для больших данных)

Если вы работаете с большими матрицами (тысячи строк/столбцов), стандартные функции Excel могут тормозить. В этом случае поможет Power Query — инструмент для преобразования данных, встроенный в Excel 2016+.

Алгоритм действий:

  1. Импортируйте обе матрицы в Power Query (данные → получить данные → из таблицы/диапазона).
  2. Для первой матрицы добавьте индексный столбец (вкладка "Добавить столбец" → "Индексный столбец").
  3. Выполните операцию объединения (вкладка "Главная" → "Объединить запросы") по индексам.
  4. Разверните полученные столбцы и удалите лишние.
  5. Загрузите результат обратно в Excel.

Этот метод сложнее, чем МУМНОЖ, но позволяет работать с данными, которые не помещаются в память Excel. Например, так можно перемножить матрицы 10000×50 и 50×100, что невозможно сделать стандартными средствами.

Почему Power Query лучше для больших матриц?

Power Query обрабатывает данные по частям (потоковая обработка), не загружая всю матрицу в оперативную память. Это позволяет избежать ошибок "Недостаточно памяти" и ускорить вычисления на 30-50% по сравнению с МУМНОЖ.

5. Пользовательская функция на VBA для нестандартных случаев

Если ни один из вышеописанных методов не подходит, можно написать собственную функцию на VBA. Например, для умножения матриц с автоматическим дополнением нулями до совместимых размеров.

Пример кода:

Function CustomMMult(rng1 As Range, rng2 As Range) As Variant

Dim arr1(), arr2(), result()

Dim i As Long, j As Long, k As Long

Dim rows1 As Long, cols1 As Long, rows2 As Long, cols2 As Long

' Определяем размеры матриц

rows1 = rng1.Rows.Count

cols1 = rng1.Columns.Count

rows2 = rng2.Rows.Count

cols2 = rng2.Columns.Count

' Проверяем совместимость

If cols1 <> rows2 Then

' Дополняем нулями до совместимости

If cols1 < rows2 Then

ReDim arr1(1 To rows1, 1 To rows2)

For i = 1 To rows1

For j = 1 To cols1

arr1(i, j) = rng1.Cells(i, j).Value

Next j

For j = cols1 + 1 To rows2

arr1(i, j) = 0

Next j

Next i

cols1 = rows2

Else

ReDim arr2(1 To cols1, 1 To cols2)

For i = 1 To rows2

For j = 1 To cols2

arr2(i, j) = rng2.Cells(i, j).Value

Next j

Next i

For i = rows2 + 1 To cols1

For j = 1 To cols2

arr2(i, j) = 0

Next j

Next i

rows2 = cols1

End If

End If

' Умножение

ReDim result(1 To rows1, 1 To cols2)

For i = 1 To rows1

For j = 1 To cols2

result(i, j) = 0

For k = 1 To cols1

result(i, j) = result(i, j) + rng1.Cells(i, k).Value * rng2.Cells(k, j).Value

Next k

Next j

Next i

CustomMMult = result

End Function

Чтобы использовать эту функцию:

  1. Нажмите Alt+F11, чтобы открыть редактор VBA.
  2. Вставьте код в новый модуль (Insert → Module).
  3. В Excel введите формулу как формулу массива: =CustomMMult(A1:C2; E1:F3) + Ctrl+Shift+Enter.

⚠️ Внимание: Пользовательские функции VBA могут значительно замедлить работу Excel при больших матрицах (более 100×100). Для оптимизации отключите автоматический пересчёт (Формулы → Параметры вычислений → Вручную) на время работы функции.

6. Частые ошибки и как их исправить

Даже опытные пользователи допускают ошибки при умножении матриц. Вот самые распространённые из них и способы их устранения:

Ошибка Причина Решение
#ЗНАЧ! в МУМНОЖ Несовпадение размерностей (кол-во столбцов первой матрицы ≠ кол-ву строк второй) Проверьте размеры матриц или используйте транспонирование/дополнение нулями
#ССЫЛКА! Неверно указан диапазон (например, A1:C2 вместо A1:B2) Дважды проверьте адреса ячеек в формуле
Неверный результат (например, все нули) Забыли нажать Ctrl+Shift+Enter для формулы массива Повторите ввод формулы с правильным завершением
Excel "зависает" при больших матрицах Слишком много данных для стандартных функций Используйте Power Query или разбивайте матрицы на части

Ещё одна типичная проблема — округление чисел. Excel хранит числа с ограниченной точностью, поэтому при умножении матриц с дробными значениями результат может немного отличаться от теоретического. Чтобы минимизировать погрешность, используйте функцию ОКРУГЛ для итоговой матрицы:

=ОКРУГЛ(МУМНОЖ(A1:C2; E1:F3); 5)

⚠️ Внимание: Если в матрицах есть пустые ячейки, Excel будет воспринимать их как нули. Это может исказить результат, особенно если пустые ячейки означают отсутствие данных, а не нулевые значения. Перед умножением заполните все пустоты явными нулями или используйте функцию ЕСЛИ для игнорирования пустых ячеек.

7. Практическое применение: где это используется?

Умножение матриц с разной размерностью применяется в самых разных областях:

  • 📊 Статистика: расчёт регрессионных моделей, где матрица данных (n×m) умножается на вектор коэффициентов (m×1).
  • 🤖 Машинное обучение: обучение нейронных сетей, где веса слоёв (k×l) умножаются на входные данные (l×m).
  • 🏗️ Инженерия: расчёты напряжений в конструкциях, где матрица жёсткости (n×n) умножается на вектор нагрузок (n×1).
  • 💰 Финансы: портфельный анализ, где матрица доходностей активов (m×n) умножается на вектор весов (n×1).

Пример из финансов: предположим, у вас есть доходности 3 акций за 5 лет (матрица 5×3) и веса этих акций в портфеле (вектор 3×1). Умножив их, вы получите годовую доходность портфеля (5×1).

☑️ Подготовка матриц к умножению

Выполнено: 0 / 5

8. Альтернативные инструменты для работы с матрицами

Если Excel не справляется с вашей задачей, рассмотрите специализированные инструменты:

  • 📉 Python (NumPy): Библиотека NumPy позволяет умножать матрицы любой размерности с высокой точностью. Пример кода:
    import numpy as np
    

    A = np.array([[1, 2], [3, 4], [5, 6]])

    B = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

    result = np.dot(A, B)

  • 📈 MATLAB: Встроенная поддержка матричных операций, включая псевдообратные матрицы (pinv).
  • 📊 Google Sheets: Функция MMULT работает аналогично Excel, но лучше оптимизирована для совместной работы.
  • 🖥️ Wolfram Alpha: Онлайн-калькулятор для символьных матричных вычислений (полезно для проверки результатов).

Excel удобен для небольших матриц и интеграции с другими данными, но для серьёзных вычислений (например, матрицы 1000×1000) лучше использовать Python или MATLAB.

FAQ: Ответы на частые вопросы

Можно ли в Excel умножить матрицу 3×2 на матрицу 3×3?

Нет, стандартная функция МУМНОЖ не позволит этого сделать, потому что количество столбцов первой матрицы (2) не равно количеству строк второй (3). Вы можете:

  • Транспонировать вторую матрицу (станет 3×33×3, но это изменит смысл операции).
  • Дополнить первую матрицу нулевым столбцом (станет 3×3).
  • Использовать псевдообратную матрицу для приближённого решения.
Почему при умножении матриц получаются очень большие или очень маленькие числа?

Это связано с переполнением или антипереполнением — ограничениями на представление чисел в Excel. Максимальное число в Excel — ~1.8×10308, минимальное положительное — ~2.2×10-308. Чтобы избежать проблемы:

  • Масштабируйте данные (разделите все элементы матриц на 1000 перед умножением, а результат умножьте на 1000×1000).
  • Используйте логарифмы (если умножение заменяется сложением логарифмов).
  • Перейдите на инструменты с произвольной точностью (например, Wolfram Alpha).
Как умножить матрицу на число (скаляр)?

Для этого не нужны специальные функции — просто умножьте каждый элемент матрицы на число. Например, если матрица в A1:C2, а скаляр в E1, используйте формулу массива:

=A1:C2 * $E$1

Или для отдельной ячейки:

=A1 * $E$1

Не забудьте растянуть формулу на весь диапазон результата.

Можно ли умножить три матрицы сразу в одной формуле?

Да, функция МУМНОЖ поддерживает цепочки умножений. Например, для матриц A (2×3), B (3×2) и C (2×4):

=МУМНОЖ(МУМНОЖ(A1:C2; E1:F3); H1:K2)

Важно, чтобы размерности были совместимы на каждом этапе: A×B даёт 2×2, а умножение на C (2×4) возможно.

Как проверить, правильно ли я умножил матрицы?

Есть несколько способов верификации:

  • Умножьте вручную 2-3 элемента результата и сравните с формулой.
  • Используйте онлайн-калькуляторы (например, MatrixCalc).
  • Проверьте свойства результата:
    • Если умножить матрицу A (m×n) на B (n×k), результат должен быть m×k.
    • Умножение на единичную матрицу должно давать исходную матрицу.