【发布时间】:2019-07-11 14:37:46
【问题描述】:
我正在尝试创建一个无需 numpy 或 zip* 即可进行矩阵乘法的代码。当我定义接收乘法结果的零矩阵时,代码工作正常,但是当我尝试使变量由循环定义时,结果重叠。
我显然不能只定义空矩阵,因为编译器给出的索引超出范围错误,并且乘法结果矩阵会根据输入而变化。在定义空矩阵以及让代码创建空矩阵时,我为空矩阵提供了屏幕截图。
def empty(X, Y):
P=[]
row=[]
for r in range(len(Y[0])):
row.append(0)
for t in range(len(X)):
P.append(row)
return P
def multiply(X, Y):
P=empty(X, Y)
#P=[[0, 0], [0, 0], [0, 0]]
for i in range(len(X)):
for j in range(len(Y[0])):
for k in range(len(Y)):
P[i][j] += X[i][k] * Y[k][j]
return P
def One(X, Y):
x=[]
b=[]
count=0
for i in range(len(X)):
b.append(1)
x.append(b)
x.append(X)
return x
d=[[1, 2], [2, 3], [2, 4]]
b=[[2, 4], [5, 6]]
print(multiply(d,b))
print(empty(d,b))
这两个矩阵在输出窗口中看起来相同。第一个是我手动定义为P=[[0,0],[0,0],[0,0]] 的那个。
第二个是从empty() 函数创建的。结果与乘法函数不同;由于某种原因,它被覆盖了。
【问题讨论】:
-
也许这会有所帮助:google.com/…
-
您在这个看似不同的问题中犯了同样的错误:stackoverflow.com/questions/56990015/… 基本上,
P中的所有行都引用了相同的列表对象row。因此,当您更改P[i][j]时,您实际上是在更改P[:][j]。您可以像这样复制row:P.append(row[:]) -
感谢您的反馈。我修复了空矩阵函数。现在工作正常。
-
@Nasser 但是你犯的错误是一个非常重要的理解。我建议您仔细阅读该链接中的答案。
-
我认为在这种情况下您不应该使用名为
X的变量和其他名为x的变量,因为这会导致误解。
标签: python arrays matrix matrix-multiplication