首页 > 解决方案 > 以下代码如何用于 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]

请尽可能基本地解释,因为我是编程新手,所以在这一点上对我来说没有什么是微不足道的。感谢您抽出时间帮助他人:)

标签: pythonnumpy

解决方案


这是您的代码的实际结果:

   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 的所有列,就像jB 的每一行一样i,以便对所有(行)x(列)对执行乘法:

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

推荐阅读