我正在尝试在python中进行矩阵乘法,我发现了以下我试图理解的代码。 (我知道如何手动乘法矩阵,并且我想了解以下代码如何执行相同的操作,这意味着我通过计算(1 * 1 + 3 * 3)计算BA中的第一个元素(第1行第1列) + 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]
我知道列表的length命令返回该列表中有多少个元素。由于B是矩阵,因此我不确定它在这里如何工作,我假设它返回多少行。
len(B)的范围将是(0,3)对应于行1,2和3。 因为范围内的i对应于i = 0,i = 1,i = 2
接下来令人困惑的是len(A [0])中的j A的第一个元素是第一行,因此这里的长度将对应于A的第一个元素中有多少个元素。
基本上,我对该示例给出了什么范围和len等有基本的了解,但是我希望更好地了解i,j,k的每个值以及这些值的最后一行我真的不明白
BA[i][j] += B[i][k] * A[k][j]
请尽可能简单地解释一下,因为我是编程新手,所以在这一点上,对我来说并不重要。谢谢您抽出宝贵时间来帮助他人:)
答案 0 :(得分:1)
这是您的代码的实际结果:
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]
的值。
以下嵌套循环将以j
遍历B的每一行,以i
遍历A的所有列,以便对所有(行)x(列)对执行乘法:>
for i in range(len(B)):
for j in range(len(A[0])):
答案 1 :(得分:0)
在此将数组视为对函数列表的更方便表示。
A建立在列表[[ 1, 4, 5 ],[ 3, 2, 9], [ 3,6, 2], [ 1,6, 8]]
(长度为4的列表)的顶部。
range(start, stop)
是一个函数,该函数返回一个生成器,该生成器从起点到终点生成一个整数序列,不包括停止点。如果未提供,则开始默认为0。
B的长度为4行,因此range(len(B))
类似于range(0, 3)
,当由for循环“询问”时,它将产生0、1、2的整数。 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行的元素与矩阵B的索引k的乘积;以及矩阵A的行k和索引j的元素。
答案 2 :(得分:0)
在您的代码示例中,矩阵表示为一个子列表列表,其中每个子列表都是一行。
所以最外面的循环遍历了B行:
for i in range(len(B)):
A[0]
是A的第一行,其中的元素数是A的列数。
第二个循环遍历A的列:
for j in range(len(A[0])):
最内层的循环简单地将B的第j行和A的第i行的元素乘积相加。
BA[i][j] += B[i][k] * A[k][j]
这会将产品添加到BA[i][j]
中。 +=
将其右参数添加到左参数中。