python - 以下代码如何用于 Python 中的矩阵乘法
问题描述
我正在尝试在 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 in range len(A[0]) A 的第一个元素是第一行,因此这里的长度将对应于 A 的第一个元素中有多少个元素。
基本上我对这个例子的范围和 len 等有一个基本的了解,但我想更好地理解 i、j、k 的每个值,因为这些以及我真正不知道的最后一行不明白。
BA[i][j] += B[i][k] * A[k][j]
请尽可能基本地解释,因为我是编程新手,所以在这一点上对我来说没有什么是微不足道的。感谢您抽出时间帮助他人:)
解决方案
这是您的代码的实际结果:
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]
表示矩阵B的第0行。k
迭代A的所有行,其大小与B中
A[k][0]
的列数相同。表示矩阵A的第0列。
循环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])):
推荐阅读
- image - QML:在 GridView 中加载图像
- matplotlib-basemap - 使用 Metpython 和底图进行点插值
- angular - 用 karma jasmine angular2 测试 void
- php - 将项目动态添加到数组 Mike42 php
- docker - 有什么方法可以防止 k8s pod 被驱逐?
- microservices - jhipster 网关和微服务
- python - Python:Azure 存储表在存在时无法插入批处理项
- coldfusion - 从字符串中剥离非 html 标签/文本
- python-3.x - 如何使用 sjoin 合并两个 GeoDataFrames 而不会出错
- powershell - 从 (Send-MailMessage) 返回到 -body 参数中的语言特定变量