Умножение матриц — одна из самых востребованных операций в линейной алгебре, статистике и инженерных расчётах. Но когда речь идёт о перемножении трёх матриц в Microsoft Excel, многие пользователи сталкиваются с трудностями: стандартные функции работают только с парами матриц, а последовательное применение формул чревато ошибками согласования размерностей. Эта статья не просто объяснит, как выполнить операцию, но и раскроет нюансы, которые экономят часы debugging’а.
Вы думаете, что умножить три матрицы в Excel так же просто, как сложить три числа? Это заблуждение: матричное умножение неассоциативно в плане порядка операций, и Excel не имеет встроенной функции для цепочки из трёх матриц. Здесь важно понимать, что результат зависит от последовательности действий: `(A×B)×C` не всегда равно `A×(B×C)` из-за особенностей округления и алгоритмов. Мы разберём все подводные камни — от проверки размерностей до оптимизации формул для больших массивов.
В отличие от ручных вычислений, где можно последовательно перемножать пары, в Excel требуется либо вложенность функций, либо использование промежуточных массивов. А если матрицы динамические (например, подгружаются из Power Query), задача усложняется вдвойне. Эта статья подойдёт и новичкам, и тем, кто уже пробовал МУМНОЖ, но получал ошибку #ЗНАЧ!.
1. Подготовка данных: правила согласования матриц
Прежде чем перемножать три матрицы, убедитесь, что их размерности совместимы. Для операции `A × B × C` должно выполняться два условия:
- Число столбцов матрицы A равно числу строк матрицы B.
- Число столбцов матрицы B равно числу строк матрицы C.
Если хотя бы одно из этих правил нарушено, Excel вернёт ошибку #ЗНАЧ!. Например, нельзя умножить матрицы размером 3×2, 3×3 и 2×4: первая пара несовместима (2 ≠ 3).
Проверьте размерности ваших матриц с помощью функции СТРОКА() и СТОЛБЕЦ():
=СТРОКА(A1:A3) → вернёт 3 (количество строк)
=СТОЛБЕЦ(A1:C1) → вернёт 3 (количество столбцов)
⚠️ Внимание: Если матрицы содержат текст или пустые ячейки, Excel автоматически преобразует их в ноль. Это может исказить результат! Используйте ЕЧИСЛО() для проверки данных.
Для наглядности приведём таблицу совместимых размерностей:
| Матрица A | Матрица B | Матрица C | Результат |
|---|---|---|---|
| 2×3 | 3×4 | 4×2 | 2×2 |
| 5×1 | 1×3 | 3×1 | 5×1 |
| 4×4 | 4×4 | 4×4 | 4×4 |
| 3×2 | 2×5 | 5×1 | 3×1 |
Если ваши матрицы не подходят под эти схемы, придётся трансформировать их (например, добавить строки/столбцы с нулями) или пересматривать задачу.
2. Метод 1: Последовательное применение МУМНОЖ
Самый очевидный способ — использовать функцию МУМНОЖ (или MMULT в английской версии) дважды. Сначала умножаем первые две матрицы, затем результат — на третью.
Допустим, у нас есть:
- 📌 Матрица A в диапазоне
B2:D4(3×3) - 📌 Матрица B в диапазоне
F2:H4(3×3) - 📌 Матрица C в диапазоне
J2:L4(3×3)
Формула для итоговой матрицы (например, в ячейке N2):
=МУМНОЖ(МУМНОЖ(B2:D4; F2:H4); J2:L4)
Важно: это формула массива! После ввода нажмите Ctrl+Shift+Enter (в новых версиях Excel формула автоматически станет массивом).
Если вы видите фигурные скобки `{}` вокруг формулы — всё сделано правильно. Если нет, повторите ввод с горячими клавишами.
⚠️ Внимание: В Excel 365 и 2021 формулы массивов вводятся безCtrl+Shift+Enter, но в старых версиях (2016 и ранее) это обязательно. Проверьте свою версию вФайл → Учётная запись → О программе Excel.
Убедиться, что размерности совместимы|Проверить ячейки на наличие текста/пустот|Выделить диапазон для результата (строки×столбцы)|Ввести формулу как массив (Ctrl+Shift+Enter)
-->
3. Метод 2: Использование промежуточной матрицы
Если последовательное умножение даёт ошибки (например, из-за ограничений на вложенность формул), разбейте задачу на два этапа:
- Сначала умножьте A и B, сохраните результат в отдельном диапазоне.
- Затем умножьте полученную матрицу на C.
Пример:
- В диапазоне
B10:D12введите формулу=МУМНОЖ(B2:D4; F2:H4)и подтвердите как массив. - В диапазоне
F10:H12введите=МУМНОЖ(B10:D12; J2:L4)(опять как массив).
Преимущества этого метода:
- 🔹 Проще отлаживать: видно промежуточный результат.
- 🔹 Меньше нагрузка на вычисления (актуально для больших матриц).
- 🔹 Можно проверять корректность на каждом этапе.
Недостаток: занимает больше места на листе. Если матрицы большие (например, 100×100), этот метод может замедлить работу книги.
4. Метод 3: Функция MMULT в Power Query (для динамических данных)
Если ваши матрицы подгружаются из внешних источников (например, из базы данных или CSV), удобнее использовать Power Query. Этот метод подходит для автоматизации и работы с большими наборами данных.
Алгоритм действий:
- Импортируйте матрицы в Power Query через
Данные → Получить данные → Из таблицы/диапазона. - Для каждой матрицы создайте запрос (например,
Query_A,Query_B,Query_C). - В редакторе Power Query добавьте пользовательский столбец с формулой умножения (на языке M):
Примечание: Это упрощённый пример для одной строки. Для полноценного умножения потребуется более сложный скрипт.= Table.FromRecords({[Row1 = List.Transform(Query_A[Column1], (x) => List.Sum(List.Transform(Query_B[Column1], (y) => x * y)))]
})
- Загрузите результат обратно в Excel.
Power Query позволяет:
- 🔄 Обновлять данные одним кликом.
- 📊 Работать с матрицами размером более 10 000×10 000 (в отличие от ограничений стандартных формул).
- 🔗 Комбинировать умножение с другими преобразованиями (фильтрация, сортировка).
⚠️ Внимание: Скрипты на языке M требуют знания основ программирования. Для новичков проще использовать методы 1 или 2.
Пример полного скрипта для умножения трёх матриц в Power Query
let
A = Excel.CurrentWorkbook(){[Name="Матрица_A"]}[Content],
B = Excel.CurrentWorkbook(){[Name="Матрица_B"]}[Content],
C = Excel.CurrentWorkbook(){[Name="Матрица_C"]}[Content],
// Преобразуем таблицы в списки списков
ListA = Table.ToRows(A),
ListB = Table.ToRows(B),
ListC = Table.ToRows(C),
// Умножаем A и B
AB = List.Transform(ListA, (rowA) =>
List.Transform(List.Transform(ListB, (rowB) =>
List.Sum(List.Zip({rowA, rowB}))), (x) => x)),
// Умножаем результат на C
ABC = List.Transform(AB, (rowAB) =>
List.Transform(List.Transform(ListC, (rowC) =>
List.Sum(List.Zip({rowAB, rowC}))), (x) => x)),
// Преобразуем обратно в таблицу
Result = Table.FromList(ABC, Splitter.SplitByNothing(), {"Column1", "Column2", "Column3"})
in
Result
5. Метод 4: VBA-скрипт для умножения трёх матриц
Если вам нужно умножать матрицы регулярно, напишите макрос. Это ускорит процесс и уменьшит риск ошибок. Ниже приведён код для умножения трёх матриц с проверкой размерностей:
Sub MultiplyThreeMatrices()
Dim ws As Worksheet
Set ws = ActiveSheet
' Диапазоны матриц (измените под свои данные)
Dim rngA As Range, rngB As Range, rngC As Range
Set rngA = ws.Range("B2:D4") ' 3x3
Set rngB = ws.Range("F2:H4") ' 3x3
Set rngC = ws.Range("J2:L4") ' 3x3
' Проверка размерностей
If rngA.Columns.Count <> rngB.Rows.Count Or _
rngB.Columns.Count <> rngC.Rows.Count Then
MsgBox "Ошибка: несовместимые размерности матриц!", vbCritical
Exit Sub
End If
' Умножение A и B
Dim tempArray() As Variant
tempArray = MatrixMultiply(rngA, rngB)
' Умножение результата на C
Dim resultArray() As Variant
resultArray = MatrixMultiply(Application.Transpose(tempArray), rngC)
' Вывод результата (например, в диапазон N2:P4)
ws.Range("N2").Resize(UBound(resultArray, 1), UBound(resultArray, 2)).Value = resultArray
End Sub
Function MatrixMultiply(rng1 As Range, rng2 As Range) As Variant
Dim i As Long, j As Long, k As Long
Dim m As Long, n As Long, p As Long
m = rng1.Rows.Count
n = rng1.Columns.Count
p = rng2.Columns.Count
ReDim result(1 To m, 1 To p) As Double
For i = 1 To m
For j = 1 To p
result(i, j) = 0
For k = 1 To n
result(i, j) = result(i, j) + rng1.Cells(i, k).Value * rng2.Cells(k, j).Value
Next k
Next j
Next i
MatrixMultiply = result
End Function
Как использовать этот код:
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в новый модуль (
Insert → Module). - Запустите макрос через
F5или кнопку на листе.
Преимущества VBA:
- 🚀 Работает в 10–100 раз быстрее формул для больших матриц (1000×1000).
- 🔧 Можно добавить обработку ошибок (например, проверку на пустые ячейки).
- 📁 Легко интегрировать в пользовательские функции (
UDF).
⚠️ Внимание: Макросы отключены по умолчанию в Excel из-за риска вирусов. Включите их в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов (выберите "Включить все макросы").
6. Типичные ошибки и как их избежать
Даже опытные пользователи Excel допускают ошибки при умножении матриц. Вот самые распространённые:
- 🔴 #ЗНАЧ!: Несовпадение размерностей. Проверьте количество столбцов первой матрицы и строк второй (и так далее для третьей).
- 🔴 #ССЫЛКА!: Формула массива введена неверно. Убедитесь, что выделили правильный диапазон для результата до ввода формулы.
- 🔴 Неверный результат: Забыли нажать
Ctrl+Shift+Enterв Excel 2016 или ранее. В новых версиях проверьте, появились ли фигурные скобки `{}`. - 🔴 Медленная работа книги: Слишком большие матрицы (более 1000×1000) в формулах. Используйте VBA или Power Query.
- 🔴 Округление: Excel хранит числа с точностью до 15 знаков. Для финансовых расчётов используйте функцию
ТОЧНОСТЬ.
Если результат умножения кажется нелогичным, проверьте:
- Содержат ли матрицы скрытые символы (пробелы, неразрывные пробелы). Используйте
СЖПРОБЕЛЫ(). - Нет ли в ячейках формул вместо чисел (например,
=A1*2вместо5). - Не переполнен ли диапазон результата. Если итоговая матрица 10×10, а вы выделили только 5×5 ячеек, часть данных будет утеряна.
Для отладки используйте функцию ПРОСМОТР(), чтобы вывести промежуточные значения:
=ПРОСМОТР(1; 0/(МУМНОЖ(B2:D4; F2:H4)=0); МУМНОЖ(B2:D4; F2:H4))
Эта формула покажет первую ненулевую ячейку результата умножения A и B.
7. Альтернативные инструменты для умножения матриц
Если Excel не справляется с задачей (например, из-за ограничений на размер матриц), рассмотрите альтернативы:
| Инструмент | Преимущества | Недостатки |
|---|---|---|
| Python (библиотека NumPy) | Обрабатывает матрицы любого размера, высокая скорость. | Требует знания программирования. |
| MATLAB | Специализирован для матричных вычислений, встроенные функции. | Платный, сложный для новичков. |
| Google Sheets | Функция MMULT работает аналогично Excel, но с лучшей поддержкой массивов. |
Ограничения на размер данных (5 млн ячеек). |
| Wolfram Alpha | Поддерживает символьные вычисления (например, с переменными). | Не подходит для автоматизации в Excel. |
Если вам нужно остаться в экосистеме Microsoft, попробуйте Excel Online или Power BI — они лучше оптимизированы для работы с большими массивами.
Для перехода на Python достаточно установить библиотеку NumPy и использовать следующий код:
import numpy as np
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
C = np.array([[9, 10], [11, 12]])
result = np.dot(np.dot(A, B), C)
print(result)
=LET(
AB; МУМНОЖ(B2:D4; F2:H4);
ABC; МУМНОЖ(AB; J2:L4);
ABC
)
Это упрощает чтение сложных вычислений.
-->
FAQ: Ответы на частые вопросы
Можно ли умножить три матрицы в Excel без VBA?
Да, используйте вложенные функции МУМНОЖ (метод 1) или промежуточные диапазоны (метод 2). VBA нужен только для очень больших матриц или автоматизации.
Почему результат умножения в Excel отличается от ручных расчётов?
Причины:
- Excel округляет числа до 15 знаков после запятой.
- В ручных расчётах могли быть ошибки (например, пропущенный знак).
- В матрицах есть скрытые пробелы или текстовые значения (используйте
ЕЧИСЛО()).
Проверьте промежуточные результаты с помощью ОКРУГЛ().
Как умножить три матрицы, если они находятся на разных листах?
Укажите адреса с именем листа:
=МУМНОЖ(МУМНОЖ(Лист1!B2:D4; Лист2!F2:H4); Лист3!J2:L4)
Или присвойте диапазонам имена через Формулы → Диспетчер имён.
Можно ли умножить три матрицы в Excel Online?
Да, функция MMULT работает и в веб-версии, но:
- Нет поддержки формул массивов (не нужно нажимать
Ctrl+Shift+Enter). - Ограничение на размер данных — до 5 млн ячеек.
Для больших матриц используйте настольную версию Excel.
Как проверить, что умножение выполнено верно?
Способы проверки:
- 🔢 Умножьте матрицы вручную для небольшого фрагмента (например, первые 2 строки и 2 столбца).
- 🔄 Используйте другой инструмент (например, Wolfram Alpha) для сравнения.
- 📊 Постройте график результата (если матрицы квадратные, определитель должен сохраняться при умножении на единичную матрицу).