Как работает следующий код для умножения матриц в Python - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь сделать матричное умножение в Python. Я нашел следующий код, который я пытаюсь понять.(Я знаю, как умножать матрицы вручную, и я хочу понять, как следующий код выполняет то же действие, и под этим я подразумеваю, что первый элемент в BA (строка 1, столбец 1) вычисляется с помощью (1 * 1 + 3 * 3).+ 3 * 3 + 1 * 1) и т. Д.

from numpy import array
A= array([[ 1, 4, 5 ],[ 3, 2, 9], [ 3,6, 2], [ 1,6, 8]])
B=A.T

BA= array([[ 0, 0, 0 ],[ 0,0, 0], [ 0,0, 0] ])

for i in range(len(B)):
   for j in range(len(A[0])):
       for k in range(len(A)):
           BA[i][j] += B[i][k] * A[k][j]

Я знаю, что команда длины для списка возвращает количество элементов в этом списке. Я не уверен, как это работает здесь, поскольку Bматрица, я предполагаю, что она возвращает количество строк.

диапазон len (B) будет (0,3) соответствовать строке 1,2 и 3. для i в диапазоне будет соответствовать i =0, i = 1, i = 2

следующая непонятная вещь для j в диапазоне len (A [0]) Первый элемент A - это первая строка, длина которой, таким образом, будет соответствовать количеству элементовнаходятся в первом элементе A.

По сути, у меня есть базовое понимание того, какой диапазон, длина и т. д. приведены в этом примере, но я бы хотел лучше понять каждое значение i, j, k какрезультат этого, а также последняя строка, которую я действительно неerstand.

BA[i][j] += B[i][k] * A[k][j]

Пожалуйста, объясните как можно проще, потому что я новичок в программировании, и поэтому на данный момент для меня нет ничего тривиального.Спасибо за ваше время, чтобы помочь другим :)

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Рассматривайте здесь массив как более удобное представление списка, который вы дали функции.

A построен поверх списка [[ 1, 4, 5 ],[ 3, 2, 9], [ 3,6, 2], [ 1,6, 8]], список длиной 4.

range(start, stop) - это функция, которая возвращает генератор, который выдает последовательность целых чисел, от начала до конца, остановка не включается.Если не указано, по умолчанию start имеет значение 0.

B имеет длину 4 строки, поэтому range(len(B)) будет похоже на range(0, 3), что будет давать 0,1 и 2 целых числа, когда «запрашивается» для forпетля.i в последующем будет 0,1 и 2.

A[0] возвращает первую строку A, которая имеет длину 3, поэтому, таким же образом, j впоследствии будет 0, 1 и 2 (в этом случае) ;и k впоследствии будет 0, 1, 2 и 3, поскольку A имеет длину 4.

BA [i] возвращает строку индекса i.Что также может быть проиндексировано с помощью j Так что BA [i] [j] является элементом строки i и столбца j, который мы увеличиваем на произведение элемента строки i и индекса k матрицы B;и элемент строки k и индекс j матрицы A.

0 голосов
/ 02 марта 2019

В вашем примере кода матрица представлена ​​списком подсписков, где каждый подсписок является строкой.

Таким образом, самый внешний цикл проходит по строкам B:

for i in range(len(B)):

A[0] - это первая строка A, а количество элементов в ней - количество столбцов A.

Таким образом, второй цикл проходит по столбцам A:

for j in range(len(A[0])):

Самый внутренний цикл просто суммирует произведения элементов в j-й строке B и i-й строке A.

BA[i][j] += B[i][k] * A[k][j]

Это добавляет к BA[i][j] произведение.+= добавляет правый аргумент к левому.

0 голосов
/ 02 марта 2019

Вот фактический результат из вашего кода:

   B    *   A   =      AB
1 3 3 1   1 4 5     20 34 46
4 2 6 6   3 2 9     34 92 98
5 9 2 8   3 6 2     46 98 174
          1 6 8

Предполагая i = 0 и j = 0, давайте вычислим BA[0][0], который является первым элементом из матрицы BA.

BA[0][0] = B[0][k] * A[k][0]

B[0][k] означает строку 0 из матрицы B. Поскольку k выполняет итерацию по всем строкам A, размер которого равен числу столбцов в B.
A[k][0] означает столбец 0из матрицы A.

Цикл for k in range(len(A)): будет воспроизводить:

B[0][0]*A[0][0] + B[0][1]*A[1][0] + B[0][2]*A[2][0] + B[0][3]*A[3][0]

В результате:

1 × 1 + 3 × 3 + 3 × 3+ 1 × 1 = 20

Какое значение для BA[0][0] получено из вашего кода.

Следующие вложенные циклы будут повторяться по всем столбцам A как j длякаждая строка B как i, чтобы выполнить умножение для всех пар (строка) x (столбец):

for i in range(len(B)):
   for j in range(len(A[0])):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...