Перейти к содержимому

Как умножить матрицу на вектор

  • автор:

Умножение матрицы на вектор

Умножение матрицы на вектор производится по правилу «строка на столбец». При умножении матрицы на вектор-столбец число столбцов в матрице должно совпадать с числом строк в векторе-столбце. Результатом умножения матрицы на вектор-столбец есть вектор-столбец:

\[A \cdot B =\left( \begin{matrix} a_{11} & a_{12} & \ldots & a_{1n} \\ a_{21} & a_{22} & \ldots & a_{2n} \\ \ldots & \ldots & \ldots & \ldots \\ a_{m1} & a_{m2} & \ldots & a_{mn} \\ \end{matrix} \right)\cdot \left( \begin{matrix} b_{1} \\ b_{2} \\ \ldots \\ b_{1n} \\ \end{matrix} \right)=\left( \begin{matrix} a_{11}\cdot b_{1}+a_{12}\cdot b_{2}+\ldots +a_{1n}\cdot b_{n} \\ a_{21}\cdot b_{1}+a_{22}\cdot b_{2}+\ldots +a_{2n}\cdot b_{n} \\ \ldots \quad \ldots \quad \ldots \quad \ldots \quad \ldots \quad \ldots \\ a_{m1}\cdot b_{1}+a_{m2}\cdot b_{2}+\ldots +a_{mn}\cdot b_{n} \\ \end{matrix} \right)=\left( \begin{matrix} c_{1} \\ c_{2} \\ \ldots \\ c_{1m} \\ \end{matrix} \right)\]

При умножении матрицы на вектор-строку, умножаемая матрица может быть только вектором-столбцом, причем количество строк в векторе-столбце должно совпадать с количеством столбцов в векторе-строке. Результатом такого умножения будет квадратная матрица соответствующей размерности:

\[ A \cdot B =\left( \begin{matrix} a_{1} \\ a_{2} \\ \ldots \\ a_{n} \\ \end{matrix} \right)\cdot \left( b_{1}\quad b_{2}\quad \ldots \quad b_{n} \right)=\left( \begin{matrix} a_{1}\cdot b_{1}\quad a_{1}\cdot b_{2}\quad \ldots \quad a_{1}\cdot b_{n} \\ a_{2}\cdot b_{1}\quad a_{2}\cdot b_{2}\quad \ldots \quad a_{2}\cdot b_{n} \\ \ldots \quad \ldots \quad \ldots \quad \ldots \quad \ldots \quad \ldots \\ a_{n}\cdot b_{1}\quad a_{n}\cdot b_{2}\quad \ldots \quad a_{n}\cdot b_{n} \\ \end{matrix} \right)=\left( \begin{matrix} c_{11} & c_{12} & \ldots & c_{1n} \\ c_{21} & c_{22} & \ldots & c_{2n} \\ \ldots & \ldots & \ldots & \ldots \\ c_{n1} & c_{n2} & \ldots & c_{nn} \\ \end{matrix} \right)\]

Примеры умножения матриц на вектора

\[A=\left( \begin{matrix} 2 & 4 & 0 \\ -2 & 1 & 3 \\ -1 & 0 & 1 \\ \end{matrix} \right),\text{ } B=\left( \begin{matrix} 1 \\ 2 \\ -1 \\ \end{matrix} \right)\]

\[A\cdot B=\left( \begin{matrix} 2 & 4 & 0 \\ -2 & 1 & 3 \\ -1 & 0 & 1 \\ \end{matrix} \right)\cdot \left( \begin{matrix} 1 \\ 2 \\ -1 \\ \end{matrix} \right)=\left( \begin{matrix} 2\cdot 1+4\cdot 2+0\cdot \left( -1 \right) \\ -2\cdot 1+1\cdot 2+3\cdot \left( -1 \right) \\ -1\cdot 1+0\cdot 2+1\cdot \left( -1 \right) \\ \end{matrix} \right)=\left( \begin{matrix} 2+8+0 \\ -2+2-3 \\ -1+0-1 \\ \end{matrix} \right)=\left( \begin{matrix} 10 \\ -3 \\ -2 \\ \end{matrix} \right)\]

\[ A=\left( \begin{matrix} 3 \\ 2 \\ 0 \\ -1 \\ \end{matrix} \right) ,\text{ } B=\left( \begin{matrix} -1 & 1 & 0 & 2 \\ \end{matrix} \right) \]

\[A \cdot B =\left( \begin{matrix} 3 \\ 2 \\ 0 \\ 1 \\ \end{matrix} \right)\cdot \left( \begin{matrix} -1 & 1 & 0 & 2 \\ \end{matrix} \right)=\left( \begin{matrix} 3\cdot \left( -1 \right) & 3\cdot 1 & 3\cdot 0 & 3\cdot 2 \\ 2\cdot \left( -1 \right) & 2\cdot 1 & 2\cdot 0 & 2\cdot 2 \\ 0\cdot \left( -1 \right) & 0\cdot 1 & 0\cdot 0 & 0\cdot 2 \\ 1\cdot \left( -1 \right) & 1\cdot 1 & 1\cdot 0 & 1\cdot 2 \\ \end{matrix} \right)=\left( \begin{matrix} -3 & 3 & 0 & 6 \\ -2 & 2 & 0 & 4 \\ 0 & 0 & 0 & 0 \\ -1 & 1 & 0 & 2 \\ \end{matrix} \right)\]

Читайте также:

Собственные векторы и значения матрицы

Невырожденная и вырожденная матрица

Введение

Умножение матрицы на вектор широко используется на различных этапах решения прикладных задач. Часто данную операцию необходимо производить множество раз на протяжении всего процесса выполнения задачи, на что тратится большое время. Для оптимизации времени выполнения используются разные алгоритмы умножения, так же применяют специальные библиотеки, решающие эту задачу. Одним из методов оптимизации умножения матрицы на вектор является распределение вычислений на многоядерных системах. В данной работе будет рассмотрен блочный алгоритм параллельного умножения матрицы на вектор.

Последовательный алгоритм

При последовательном умножении матрицы на вектор, скалярно умножается i-я строка матрицы на вектор, результат записывается в i-ю компоненту результирующего вектора.

Параллельный алгоритм с блочным разбиением

При разделении элементов матрицы на блоки, каждому процессу распределяется блок элементов исходной матрицы. В результате скалярного умножения строк блока на соответствующие элементы вектора b, на каждом процессе размещается часть вектора с. Для сбора результирующего вектора необходимо просуммировать частичные результаты, затем собрать все компоненты вектора с в надлежащем порядке.

Оценка сложности

При оценке эффективности принимается несколько предположений: перемножаемая матрица квадратная, операции сложения и умножения выполняются за одинаковое время, вычислительная система однородна. При последовательном умножении матрицы на вектор количество вычислительных операций составляет T=n^2. При параллельном алгоритме количество вычислительных операций составляет T=(n^2)/p. Показатели ускорения и эффективности имеют вид S=(n^2)/(n^2/p)=p E=(n^2)/(p*(n^2/p))=1 Общее время работы алгоритма с блочным разбиением матрицы(решетка имеет вид p=s*q) составляет T=(n/s)(2(n/q)-1)t+(a+w(n/s)/b)log_2(q) где a — латентность вычислительной сети, b — пропускная способность вычислительной сети, w — размер одного элемента в байтах, t — время выполнения одной арифметической операции(предположим что умножение и сложение выполняется за одно время).

Демонстрация работы алгоритма

Серийные тесты

Эксперименты проводились на двухпроцессорном вычислителе на базе двухядерных процессоров Intel Core 2 Duo, 2.33 Ггц, 4 Гб RAM, Microsoft Windows 7 Enterprise 2010. Связь между узлами 1 Gigabit Ethernet. IDE Microsoft Visual Studio 2008, стандартный компилятор, Microsoft MPI. Параметры теоретических зависимостей в данной вычислительной системе имеют значения: t — 2.25 нсек, латентность — 44мсек, пропускная способность — 39,73 Мбайт/с и величина w равна 8 байт.

Последоваетльный алгоритм / Параллельный алгоритм в один процесс, с

Произведение матриц и векторов, элементы линейной алгебры

Пришло время познакомиться с одной из фундаментальных возможностей пакета NumPy–матричных и векторных вычислений. На одном из прошлых занятий мы с вами уже видели, как можно поэлементно умножать один вектор на другой или одну матрицу на другую:

a = np.arange(1, 10).reshape(3, 3) b = np.arange(10, 19).reshape(3, 3) a*b

В консоли увидим результат:

array([[ 10, 22, 36],
[ 52, 70, 90],
[112, 136, 162]])

Матричное умножение

Но если нам нужно выполнить именно матричное умножение, то есть, строки одной матрицы умножать на столбцы другой и результаты складывать:

то для этого следует использовать специальные функции и операторы. Начнем с функций. Итак, чтобы перемножить две матрицы a иbпо всем правилам математики, запишем следующую команду:

np.dot(a, b)

Эта функция возвращает новую матрицу (двумерный массив) с результатом умножения:

array([[ 84, 90, 96],
[201, 216, 231],
[318, 342, 366]])

Тот же результат можно получить и с помощью функции:

np.matmul(a, b)

Считается, что этот вариант предпочтительнее использовать при умножении матриц.

Векторное умножение

Аналогичные операции можно выполнять и с векторами. Математически, если у нас имеются два вектора:

то их умножение можно реализовать в двух видах:

Первое умножение реализуется либо через функцию:

a = np.arange(1, 10) b = np.ones(9) np.dot(a, b) # значение 45

Либо, более предпочтительной функцией для внутреннего умножения векторов:

np.inner(a, b) # 45

Второй вариант умножения (внешнее умножение векторов) реализуется с помощью функции:

np.outer(a, b)

получим результат в виде следующей матрицы:

array([[1., 1., 1., 1., 1., 1., 1., 1., 1.],
[2., 2., 2., 2., 2., 2., 2., 2., 2.],
[3., 3., 3., 3., 3., 3., 3., 3., 3.],
[4., 4., 4., 4., 4., 4., 4., 4., 4.],
[5., 5., 5., 5., 5., 5., 5., 5., 5.],
[6., 6., 6., 6., 6., 6., 6., 6., 6.],
[7., 7., 7., 7., 7., 7., 7., 7., 7.],
[8., 8., 8., 8., 8., 8., 8., 8., 8.],
[9., 9., 9., 9., 9., 9., 9., 9., 9.]])

Операция умножения матриц и векторов используется довольно часто, поэтому в пакете NumPy имеется весьма полезный перегруженный оператор, заменяющий функцию matmul:

a @ b # значение 45

или, с использованием матриц:

a.resize(3, 3) b.resize(3, 3) a @ b # аналог np.matmul(a, b)

Умножение вектора на матрицу

Наконец, рассмотрим умножение вектора на матрицу. Это также можно записать двумя способами:

Для реализации первого способа, зададим одномерный вектор и двумерную матрицу:

a = np.array([1,2,3]) b = np.arange(4,10).reshape(3,2) # матрица 3x2

И, затем, воспользуемся уже знакомой нам функцией dot:

np.dot(a, b) # array([40, 46])

При такой записи, когда одномерный массив записан первым аргументом, а матрица – вторым, получаем умножение вектора-строки на матрицу, то есть, первый способ.

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

np.dot(b, a) # несогласованность размеров

Дело в том, что массив a должен представлять вектор длиной два элемента, так как матрица b имеет размер в 3 строки и 2 столбца:

Определим массивa в два элемента и умножим на матрицу b:

a = np.array([1, 2]) np.dot(b, a) # array([14, 20, 26])

Получаем вектор-строку (одномерный массив) как результат умножения. Обратите внимание, по правилам математики вектор aдолжен быть вектором-столбцом, то есть, быть представленным в виде:

a.shape = -1, 1 # вектор-столбец 2x1

Но мы использовали вектор-строку. В NumPyтак тоже можно делать и это не приведет к ошибке. Результат будет именно умножение матрицы как бы на вектор-столбец. Ну а если использовать вектор-столбец, то и на выходе получим вектор-столбец:

np.dot(b, a) # вектор-столбец 3x1

Этого же результат можно достичь, используя оператор @ (перегрузка функции matmul):

a @ b # вектор-столбец 3x1

Результат будет тем же. Вот так в NumPyвыполняется умножение матриц, векторов и вектора на матрицу.

Элементы линейной алгебры

Из высшей математики хорошо известно, что матрицы можно использовать для решения систем линейных уравнений. Для этого в NumPyсуществует модуль linalg. Давайте рассмотрим некоторые из его функций.

Предположим, имеется квадратная матрица 3×3:

a = np.array([(1, 2, 3), (1, 4, 9), (1, 8, 27)])

Первым делом вычислим ранг этой матрицы, чтобы быть уверенным, что она состоит из линейно независимых строк и столбцов:

np.linalg.matrix_rank(a) # рангравен 3

Если ранг матрицы совпадает с ее размерностью, значит, она способна описывать систему из трех независимых линейных уравнений. В нашем случае, система уравнений будет иметь вид:

Здесь — некие числа линейного уравнения. Например, возьмем их равными:

y = np.array([10, 20, 30])

Тогда корни уравнения можно вычислить с помощью функции solve:

np.linalg.solve(a, y) # array([-5. , 10. , -1.66666667])

Другой способ решения этой же системы линейных уравнений возможен через вычисление обратной матрицы. Изначально, уравнение можно записать в векторно-матричном виде:

Откуда получаем решения :

На уровне пакета NumPy это делается так:

invA = np.linalg.inv(a) # вычисление обратной матрицы invA @ y # вычисление корней

Конечно, я здесь представил лишь примеры использования модуля linalg. Приводить все функции нет смысла, так как они имеют довольно специализированное назначение и специалисты в своих областях без труда смогут ими воспользоваться. Для полноты картины я лишь приведу список наиболее характерных функций, чтобы вы знали возможности расширения linalg.

Правило умножения матриц: примеры с решением

Мы помним, что матрицы – это таблицы взаимосвязанных элементов, которые позволяют упростить математические вычисления и систематизировать определённую информацию. Их можно складывать, вычитать, умножать между собой. В этой статье подробнее остановимся на последнем алгоритме – матричном произведении.

Умножение матриц — определение

Матричное умножение – это одна из основных операций, которая проводится исключительно с согласованными матрицами.

При произведении матриц A и B получается новая матрица C. В математическом виде формула будет выглядеть так:

Формула

Но для начала разберёмся, что такое согласованные матрицы.

Согласованные матрицы

Согласованными матрицами называют матрицы вида A = [m n] и B = [n k], где количество столбцов А равно количеству строк В.

Матрица 1

Индексы показывают координаты равных элементов.

Матрица 2

Для того, чтобы умножить А и В, нужно взять строку в первой матрице и столбец во второй, перемножить одинаковые элементы и сложить полученные произведения.

Основные свойства матричного произведения

Размеры, то есть количество строк (m) и столбцов (n), влияют на особенности матричного произведения. Следовательно, для двух главных видов – квадратных и прямоугольных – действуют разные свойства произведения. Однако умножение любого вида всегда некоммуникативное. Это означает, что матрицы нельзя менять местами (АВ ≠ ВА).

Умножение квадратных матриц

Для квадратных матриц существует единичная матрица Е. В ней элементы по главной диагонали равны единице, а оставшиеся – нулю. Произведение любой квадратной матрицы на неё не влияет на результат.

Умножение квадратных матриц

В математическом виде это выглядит так: ЕА = АЕ = А

Также существует обратная матрица А (-1), при умножении на которую исходная A = [m n] даёт в результате единичную матрицу E.

Пример умножения матриц

Следовательно, формула такова: АА(-1) = Е

Умножение прямоугольных матриц

Существуют четыре основных свойства умножения:

  1. Сочетательное свойство, или ассоциативность: (AB)C = A(BC)
  2. Распределительное свойство, или дистрибутивность: А(В+С) = АВ + АС / (А+В)С = АС + ВС
  3. Умножение на единичную матрицу: ЕА = А
  4. Умножение на нулевую матрицу: 0А = 0

Напомним, что у нулевой матрицы все элементы равны нулю.

Произведение трех матриц

Произведение АВС можно получить двумя альтернативными способами:

  1. Найти АВ и умножить на С
  2. Найти ВС и умножить на А

Данное свойство называется ассоциативностью матричного умножения и действует на все виды согласованных матриц. Сами они не переставляются, меняется только порядок их умножения.

Умножение матрицы на число

Для умножения на число необходимо умножить каждый матричный элемент на это число:

Умножение матрицы на число

Дроби вносить не нужно, поскольку они могут затруднить дальнейшие операции.

Умножение матрицы на вектор

Здесь работает правило «строка на столбец».

Умножение матрицы на вектор 1

При умножении на вектор-столбец важно, чтобы количество столбцов в матрице совпадало с количеством строк в векторе-столбце. Результатом произведения будет вектор-столбец.

Умножение матрицы на вектор 2

При умножении на вектор-строку матрица должна быть только вектором-столбцом. Важно, чтобы количество строк в векторе-столбце совпадало с количеством столбцов в векторе-строке. Результатом произведения будет квадратная матрица.

Примеры задач на умножение матриц

Задача №1: выполнить умножение и найти С, если A = [m n] и B = [n k] равны.

Примеры задач на умножение матриц

Примеры задач на умножение матриц 2

Задача №2: вычислить С, если А = [m n] и вектор-столбец В равны.

Задача 2

c11 = a11·b11 + a12·b21 = 2·1 + (-1)·2 + 3·(-1) = -3

c21 = a11·b12 + a12·b22 = 4⋅1 + 2⋅2 + 0⋅2 = 8

c31 = a21·b11 + a22·b21 = −1⋅1 + 1⋅2 + 1⋅(−1) = 0

Ответ задачи

Изучение матричных операций очень увлекательное, но сложное занятие. Если у вас нет времени на учёбу, ФениксХэлп может помочь в решении контрольных и самостоятельных работ, написании статей и диссертаций.

  • Профессиональное и личностное развитие
  • Залипательная наука
  • Подготовка к тестам, экзаменам, зачетам

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *