我正在尝试创建一个不使用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()
函数创建的一个。结果与乘法函数不同;由于某种原因它被覆盖了。
答案 0 :(得分:1)
我明白了。我使用嵌套列表推导创建了零矩阵。我认为仅将零列表添加为行是行不通的,并且弄乱了维度或列表类型。
修改后的空函数:
def empty(X,Y):
P=[]
P= [[0 for i in range(len(Y[0]))] for j in range(len(X))]
return P
答案 1 :(得分:0)
对纳赛尔的答案的补充:
您可以这样实现函数,这样就不需要变量P
:
def empty(X,Y):
return [[0 for i in range(len(Y[0]))] for j in range(len(X))]