以下代码如何在Python中用于矩阵乘法

时间:2019-03-02 12:21:54

标签: python numpy

我正在尝试在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]

请尽可能简单地解释一下,因为我是编程新手,所以在这一点上,对我来说并不重要。谢谢您抽出宝贵时间来帮助他人:)

3 个答案:

答案 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 = 0j = 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]中。 +=将其右参数添加到左参数中。