以下代码试图在Python 3.6.1中创建一个成功的矩阵。正如您所看到的,我分配了我的alpha和bravo矩阵,并希望代码生成一个Charlie矩阵(列表),其中填充了alpha和bravo矩阵的乘法结果。我的问题是,当我运行模块时,它表示没有定义c;如果我要求a或b,则相同。专家提示或指针任何人?谢谢。
import math
def matrix(a, b, c):
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]]
c = [[], [], []]
for c in matrix:
c[1][1] = a[1][1] * b[1][1] + a[1][2] * b[2][1] + a[1][3] * b[3][1]
c[1][2] = a[1][1] * b[1][2] + a[1][2] * b[2][2] + a[1][3] * b[3][2]
c[1][3] = a[1][1] * b[1][3] + a[1][2] * b[2][3] + a[1][3] * b[3][3]
c[2][1] = a[2][1] * b[1][1] + a[2][2] * b[2][1] + a[2][3] * b[3][1]
c[2][2] = a[2][1] * b[1][2] + a[2][2] * b[2][2] + a[2][3] * b[3][2]
c[2][3] = a[2][1] * b[1][3] + a[2][2] * b[2][3] + a[2][3] * b[3][3]
c[3][1] = a[3][1] * b[1][1] + a[3][2] * b[2][1] + a[3][3] * b[3][1]
c[3][2] = a[3][1] * b[1][2] + a[3][2] * b[2][2] + a[3][3] * b[3][2]
c[3][3] = a[3][1] * b[1][3] + a[3][2] * b[2][3] + a[3][3] * b[3][3]
return c
答案 0 :(得分:1)
您的代码存在许多问题。让我们一次看一个。
Python是零索引的。在Python中访问数组或列表时,第一个元素是0
,第二个元素是1
,依此类推。您将a
定义为
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
因此访问a[3][...]
将不起作用,因为它不存在。 a[0]
是[1, 2, 3]
等等。
c
时,您定义了一个空列表列表。 c[0]
处的列表是一个空列表[]
。因此,尝试访问c[0][0]
将无效,因为第0个元素不存在(无论是用于引用还是用于分配)。 就像你做的那样:
x = []
# this will not work:
x[0] = 1
如果您想要执行点积,我建议使用Numpy包。它旨在处理这种数学。
import numpy as np
c = np.dot(a, b)
c
# returns:
array([[ 20, 28, 33],
[ 50, 64, 72],
[ 80, 100, 111]])
这是一个纯python方法来获取两个矩阵的点积。它转换b
并为每个矩阵生成元素乘积的总和。请记住,它不进行维度检查,因此它将截断为最短的可计算结果。
def matrix_dot(a, b):
# transpose b
bT = list(map(list, zip(*b)))
# generate the dot product
c = [[sum(xx*yy for xx,yy in zip(x,y)) for y in bT] for x in a]
return c
a = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
b = [[3, 2, 1], [4, 4, 4], [3, 6, 8]]
matrix_dot(a,b)
# returns:
[[20, 28, 33],
[50, 64, 72],
[80, 100, 111]]