Умножение матриц
Произведением матрицы
размером на матрицу
размером называется матрица ( ) размером элементы которой определяются формулой:
![\[{{c}_{ij}}={{a}_{i1}}{{b}_{1j}}+{{a}_{i2}}{{b}_{2j}}+\ldots +{{a}_{in}}{{b}_{nj}}=\sum\limits_{s=1}^{n}{{{a}_{sn}}{{b}_{sj}}}\]](http://ru.solverbook.com/wp-content/ql-cache/quicklatex.com-32622586236e5ffb6a688e28c9e1e0f1_l3.png)
Иначе говоря, элемент матрицы стоящий в -той строке и -том столбце, равен сумме произведений элементов -той строки матрицы на соответствующие элементы -го столбца матрицы Таким образом, умножение осуществляется по правилу умножения строки на столбец.
Не всякие две матрицы можно перемножить. Произведение двух матриц возможно только в том случае, если число столбцов матрицы совпадает с числом строк в матрице . Для того чтобы перемножить две квадратные матрицы необходимо, чтобы они были одного порядка. При этом в результате получится матрица того же порядка, что и перемножаемые матрицы.
Как умножать матрицы, примеры
![\[ A=\left( \begin{matrix} 2 \\ 1 \\ \end{matrix}\quad \begin{matrix} 0 \\ -1 \\ \end{matrix}\quad \begin{matrix} 4 \\ 1 \\ \end{matrix}\quad \begin{matrix} -1 \\ 0 \\ \end{matrix} \right) \text{ }\text{ },\text{ }\text{ } B=\left( \begin{matrix} 2 \\ 1 \\ 0 \\ -2 \\ \end{matrix} \right) \]](http://ru.solverbook.com/wp-content/ql-cache/quicklatex.com-10c0cea9b24a3887c5a7b7d7b5dbb687_l3.png)
![\[A \cdot B=\left( \begin{matrix} 2 \\ 1 \\ \end{matrix}\quad \begin{matrix} 0 \\ -1 \\ \end{matrix}\quad \begin{matrix} 4 \\ 1 \\ \end{matrix}\quad \begin{matrix} -1 \\ 0 \\ \end{matrix} \right)\cdot \left( \begin{matrix} 2 \\ 1 \\ 0 \\ -2 \\ \end{matrix} \right)=\left( \begin{matrix} 2\cdot 2+0\cdot 1+4\cdot 0+\left( -1 \right)\cdot \left( -2 \right) \\ 1\cdot 2+\left( -1 \right)\cdot 1+1\cdot 0+0\cdot \left( -2 \right) \\ \end{matrix} \right)=\]](http://ru.solverbook.com/wp-content/ql-cache/quicklatex.com-e636ebcafd6023c5b67e9e9dc6b65c3d_l3.png)
![]()
Заметим, что произведение этих матриц в обратном порядке невозможно.
Произведение двух матриц в общем случае зависит от порядка сомножителей, то есть оно не коммутативно:
![\[A =\left( \begin{matrix} \begin{matrix} -1 & 1 \\ \end{matrix} \\ \begin{matrix} 2 & 0 \\ \end{matrix} \\ \begin{matrix} 0 & 3 \\ \end{matrix} \\ \end{matrix} \right) \text{ }\text{ },\text{ }\text{ } B=\left( \begin{matrix} \begin{matrix} 3 \\ 0 \\ \end{matrix} & \begin{matrix} 1 \\ -1 \\ \end{matrix} & \begin{matrix} 2 \\ 4 \\ \end{matrix} \\ \end{matrix} \right) \]](http://ru.solverbook.com/wp-content/ql-cache/quicklatex.com-2bc591171a53c6a82fa94fcb160b1512_l3.png)
![\[ A \cdot B =\left( \begin{matrix} \begin{matrix} -1 & 1 \\ \end{matrix} \\ \begin{matrix} 2 & 0 \\ \end{matrix} \\ \begin{matrix} 0 & 3 \\ \end{matrix} \\ \end{matrix} \right)\left( \begin{matrix} \begin{matrix} 3 \\ 0 \\ \end{matrix} & \begin{matrix} 1 \\ -1 \\ \end{matrix} & \begin{matrix} 2 \\ 4 \\ \end{matrix} \\ \end{matrix} \right)=\left( \begin{matrix} -1\cdot 3+1\cdot 0 & -1\cdot 1+1\cdot \left( -1 \right) & -1\cdot 2+1\cdot 4 \\ 2\cdot 3+0\cdot 0 & 2\cdot 1+0\cdot \left( -1 \right) & 2\cdot 2+0\cdot 4 \\ 0\cdot 3+3\cdot 0 & 0\cdot 1+3\cdot \left( -1 \right) & 0\cdot 2+3\cdot 4 \\ \end{matrix} \right)=\]](http://ru.solverbook.com/wp-content/ql-cache/quicklatex.com-4b8d8f7fd66e4bbd78f2136c57b5a13d_l3.png)
Произведение так же будет существовать и его размерность будет .
![\[ B \cdot A =\left( \begin{matrix} \begin{matrix} 3 \\ 0 \\ \end{matrix} & \begin{matrix} 1 \\ -1 \\ \end{matrix} & \begin{matrix} 2 \\ 4 \\ \end{matrix} \\ \end{matrix} \right)\left( \begin{matrix} \begin{matrix} -1 & 1 \\ \end{matrix} \\ \begin{matrix} 2 & 0 \\ \end{matrix} \\ \begin{matrix} 0 & 3 \\ \end{matrix} \\ \end{matrix} \right)=\left( \begin{matrix} 3\cdot \left( -1 \right)+1\cdot 2+2\cdot 0 & 3\cdot 1+1\cdot 0+2\cdot 3 \\ 0\cdot \left( -1 \right)+\left( -1 \right)\cdot 2+4\cdot 0 & 0\cdot 1+\left( -1 \right)\cdot 0+4\cdot 3 \\ \end{matrix} \right)=\]](http://ru.solverbook.com/wp-content/ql-cache/quicklatex.com-e036cd11bdca99921a4b55e765be52eb_l3.png)
Но бывают матрицы, для которых выполняется равенство
такие матрицы называются перестановочными или коммутирующими. Такие матрицы будут обязательно квадратными.
![]()
![]()
![]()
Таким образом, для заданных матриц выполняется равенство поэтому они являются перестановочными.
Как умножать матрицы
wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали, в том числе анонимно, 12 человек(а).
Количество просмотров этой статьи: 67 760.
В этой статье:
Матрица представляет собой прямоугольное расположение чисел, символов или выражений в строках и столбцах. Чтобы умножить матрицы, вам нужно умножить элементы (или числа) в строках первой матрицы на элементы в столбцах второй матрицы и сложить полученные значения. Для умножения матриц потребуется умножение, сложение и правильная расстановка результатов.
![]()
- На рисунке: первая матрица А имеет две строки, и вторая матрица B имеет два столбца.
![]()
- Матрица А имеет 2 строки, поэтому конечная матрица будет иметь 2 строки.
- Матрица B имеет 2 столбца, поэтому конечная матрица будет иметь 2 столбца.
- Конечная матрица будет иметь 2 строки и 2 столбца.
![]()
- 6 x -5 = -30
- 1 x 0 = 0
- -2 x 2 = -4
- -30 + 0 + (-4) = -34
- Четвертое скалярное произведение равно (-34) и оно записывается в правом нижнем углу конечной матрицы.
- Результат скалярного произведения записывается согласно номерам умножаемой строки и столбца. Например, когда вы нашли скалярное произведение второй строки (матрица А) и второго столбца (матрица B), результат (-34) записывается на пересечении второй строки и второго столбца конечной матрицы.

- 6 x 4 = 24
- 1 x (-3) = -3
- (-2) x 1 = -2
- 24 + (-3) + (-2) = 19
- Второе скалярное произведение равно (-19), и оно записывается на пересечении второй строки и первого столбца конечной матрицы.

- 2 x 4 = 8
- 3 x (-3) = -9
- (-1) x 1 = -1
- 8 + (-9) + (-1) = -2
- Первое скалярное произведение равно (-2), и оно записывается на пересечении первой строки и первого столбца конечной матрицы.
- Третье скалярное произведение вычисляется умножением элементов первой строки на элементы второго столбца:
Транспонирование и умножение матриц на Python
В этом уроке мы напишем программы на Python для транспонирования и умножения матриц и вывода результатов.
Прежде чем писать программу транспонирования матрицы на Python, давайте сначала посмотрим на обзор транспонирования.
Транспонирование матрицы
Если вы заменяете строки матрицы столбцом той же матрицы, это называется транспонированием матрицы. Обозначается как X’. Например: Элемент в i-й строке и j-м столбце в X будет помещен в j-ю строку и i-й столбец в X’.
Пример: Предположим, мы взяли следующую матрицу A:
A = [[5, 4, 3] [2, 4, 6] [4, 7, 9] [8, 1, 3]]
At будет транспонированием указанной выше матрицы, т. е. A [i] [j] = At [j] [i], и поэтому At должно быть:
В = [5, 2, 4, 8] [4, 4, 7, 1] [3, 6, 9, 3]
Программа Python для транспонирования матрицы
Теперь мы напишем программу на Python для транспонирования входной заданной матрицы, где мы выполняем операцию, как мы выполнили в приведенном выше примере. Чтобы выполнить операцию транспонирования матрицы, мы будем использовать метод вложенного цикла for.
Давайте разберемся с использованием и реализацией этого метода на следующем примере.
# Define a matrix A A = [[5, 4, 3], [2, 4, 6], [4, 7, 9], [8, 1, 3]] # Define an empty matrix of reverse order transResult = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] # Use nested for loop on matrix A for a in range(len(A)): for b in range(len(A[0])): transResult[b][a] = A[a][b] # store transpose result on empty matrix # Printing result in the output print("The transpose of matrix A is: ") for res in transResult: print(res)The transpose of matrix A is: [5, 2, 4, 8] [4, 4, 7, 1] [3, 6, 9, 3]
Умножение матриц
В этом разделе мы напишем программу на Python для умножения двух входных матриц и выведем результат на выходе. Эта программа укажет, как умножать две матрицы, имеющие определенные значения.
Прежде чем писать программу на Python, давайте сначала посмотрим на обзор умножения двух матриц.
Умножение матриц — это бинарная операция, в которой используется пара матриц для создания другой матрицы. Элементы в матрице умножаются в соответствии с элементарной арифметикой.
При умножении двух матриц элементы строки первой матрицы умножаются на элементы столбца второй матрицы.
Пример: предположим, что мы взяли следующие две матрицы A и B:
A = [[5, 4, 3] [2, 4, 6] [4, 7, 9]] and, B = [[3, 2, 4] [4, 3, 6] [2, 7, 5]]
C будет объединением двух указанных выше матриц, т. е. C = A + B, и поэтому C должно быть:
C = [[37, 43, 59] [34, 58, 62] [58, 92, 103]]
Как мы видим, результирующая матрица C, также известная как произведение матриц, имеет то же количество строк, что и первая матрица (матрица A), и такое же количество столбцов, как и вторая матрица (матрица B). Мы также знаем этот тип умножения матриц как скалярное произведение матриц.
Умножение двух матриц
Теперь мы напишем программу Python для умножения двух матриц, где мы выполняем умножение, как мы это делали в приведенном выше примере. Мы можем использовать различные методы для написания такой программы на Python, но в этом руководстве будем использовать только следующие два метода:
- Использование метода вложенного цикла.
- Использование метода понимания вложенного списка.
В обоих методах мы напишем пример программы, чтобы понять их реализацию для умножения двух матриц.
Способ 1: Использование метода вложенного цикла
В этом методе мы собираемся использовать вложенный цикл for для двух матриц, выполнять над ними умножение и сохранять результат умножения в третьей матрице в качестве итогового значения.
Давайте разберемся с реализацией этого метода на следующем примере.
# Define two matrix A and B in program A = [[5, 4, 3], [2, 4, 6], [4, 7, 9]] B = [[3, 2, 4], [4, 3, 6], [2, 7, 5]] # Define an empty matrix to store multiplication result multiResult = [[0, 0, 0], [0, 0, 0], [0, 0, 0]] # Using nested for loop method on A & B matrix for m in range(len(A)): for n in range(len(B[0])): for o in range(len(B)): multiResult[m][n] += A[m][o] * B[o][n] # Storing multiplication result in empty matrix # Printing multiplication result in the output print("The multiplication result of matrix A and B is: ") for res in multiResult: print(res)The multiplication result of matrix A and B is: [37, 43, 59] [34, 58, 62] [58, 92, 103]
Способ 2: Использование метода понимания вложенного списка
В этом методе мы будем использовать понимание вложенного списка, чтобы получить результат умножения двух входных матриц. При использовании в программе метода понимания списка мы также будем использовать «zip в Python» для вложенного списка. Давайте разберемся с реализацией этого метода на следующем примере.
# Define two matrix A & B in the program A = [[5, 4, 3], [2, 4, 6], [4, 7, 9]] B = [[3, 2, 4], [4, 3, 6], [2, 7, 5]] # Using nested list method with zip in Python multiResult = [[sum(a * b for a, b in zip(Arow, Bcol)) for Bcol in zip(*B)] for Arow in A] # Printing multiplication result in the output print("The multiplication result of matrix A and B is: ") for res in multiResult: print(res)The multiplication result of matrix A and B is: [37, 43, 59] [34, 58, 62] [58, 92, 103]
Базовые операции NumPy / np 3
Вы уже знаете, как создавать массив NumPy и как определять его элементы. Теперь пришло время разобраться с тем, как применять к ним различные операции.
Арифметические операторы
Арифметические операторы — первые, которые предстоит использовать. К числу наиболее очевидных относятся прибавление и умножение на скаляр.
>>> a = np.arange(4) >>> a array([0, 1, 2, 3]) >>> a+4 array([4, 5, 6, 7]) >>> a*2 array([0, 2, 4, 6])Их можно использовать для двух массивов. В NumPy эти операции поэлементные, то есть, они применяются только к соответствующим друг другу элементам. Это должны быть объекты, которые занимают одно и то же положение, так что результатом станет новый массив, содержащий итоговые величины в тех же местах, что и операнды.
>>> b = np.arange(4,8) >>> b array([4, 5, 6, 7]) >>> a + b array([ 4, 6, 8, 10]) >>> a – b array([–4, –4, –4, –4]) >>> a * b array([ 0, 5, 12, 21])Более того, эти операторы доступны и для функций, если те возвращают массив NumPy. Например, можно перемножить массив на синус или квадратный корень элементов массива b .
>>> a * np.sin(b) array([–0. , –0.95892427, –0.558831 , 1.9709598 ]) >>> a * np.sqrt(b) array([ 0. , 2.23606798, 4.89897949, 7.93725393])И даже в случае с многомерными массивами можно применять арифметические операторы поэлементно.
>>> A = np.arange(0, 9).reshape(3, 3) >>> A array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) >>> B = np.ones((3, 3)) >>> B array([[ 1., 1., 1.], [ 1., 1., 1.], [ 1., 1., 1.]]) >>> A * B array([[ 0., 1., 2.], [ 3., 4., 5.], [ 6., 7., 8.]])Произведение матриц
Выбор оператора для поэлементного применения — это странный аспект работы с библиотекой NumPy. В большинстве инструментов для анализа данных оператор * обозначает произведение матриц. Он применяется к обоим массивам. В NumPy же подобное произведение обозначается функцией dot() . Эта операция не поэлементная.
>>> np.dot(A,B) array([[ 3., 3., 3.], [ 12., 12., 12.], [ 21., 21., 21.]])Каждый элемент результирующей матрицы — сумма произведений каждого элемента соответствующей строки в первой матрице с соответствующим элементом из колонки второй. Рисунок ниже показывает процесс произведения матриц (для двух элементов).

Еще один вариант записи произведения матриц — использование одной из двух матриц в качестве объекта функции dot() .
>>> A.dot(B) array([[ 3., 3., 3.], [ 12., 12., 12.], [ 21., 21., 21.]])Но поскольку произведение матриц — это не коммутативная операция, порядок операндов имеет значение. В данном случае A*B не равняется B*A.
>>> np.dot(B,A) array([[ 9., 12., 15.], [ 9., 12., 15.], [ 9., 12., 15.]])Операторы инкремента и декремента
На самом деле, в Python таких операторов нет, поскольку нет операторов ++ или — . Для увеличения или уменьшения значения используются += и -= . Они не отличаются от предыдущих, но вместо создания нового массива с результатами присваивают новое значение тому же массиву.
>>> a = np.arange(4) >>> a array([0, 1, 2, 3]) >>> a += 1 >>> a array([1, 2, 3, 4]) >>> a –= 1 >>> a array([0, 1, 2, 3])Таким образом использование этих операторов дает возможность получать более масштабные результаты, чем в случае с обычными операторами инкремента, увеличивающими значения на один. Их можно использовать в самых разных ситуациях. Например, они подходят для изменения значений без создания нового массива.
array([0, 1, 2, 3]) >>> a += 4 >>> a array([4, 5, 6, 7]) >>> a *= 2 >>> a array([ 8, 10, 12, 14])Универсальные функции (ufunc)
Универсальная функция, известная также как ufunc , — это функция, которая применяется в массиве к каждому элементу. Это значит, что она воздействует на каждый элемент массива ввода, генерируя соответствующий результат в массив вывода. Финальный массив соответствует по размеру массиву ввода.
Под это определение подпадает множество математических и тригонометрических операций; например, вычисление квадратного корня с помощью sqrt() , логарифма с log() или синуса с sin() .
>>> a = np.arange(1, 5) >>> a array([1, 2, 3, 4]) >>> np.sqrt(a) array([ 1. , 1.41421356, 1.73205081, 2. ]) >>> np.log(a) array([ 0. , 0.69314718, 1.09861229, 1.38629436]) >>> np.sin(a) array([ 0.84147098, 0.90929743, 0.14112001, –0.7568025 ])Многие функции уже реализованы в библиотеке NumPy.
Функции агрегации
Функции агрегации выполняют операцию на наборе значений, например, на массиве, и выдают один результат. Таким образом, сумма всех элементов массива — это результат работы функции агрегации. Многие из таких функций реализованы в классе ndarray .
>>> a = np.array([3.3, 4.5, 1.2, 5.7, 0.3]) >>> a.sum() 15.0 >>> a.min() 0.29999999999999999 >>> a.max() 5.7000000000000002 >>> a.mean() 3.0 >>> a.std() 2.0079840636817816