尽管通过循环创建矩阵,但无法为矩阵乘法创建零矩阵

时间:2019-07-11 14:37:46

标签: python arrays matrix matrix-multiplication

我正在尝试创建一个不使用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))

https://imgur.com/3EVpyaF

这两个矩阵在输出窗口中看起来相同。第一个是我手动定义为P=[[0,0],[0,0],[0,0]]的那个。 第二个是从empty()函数创建的一个。结果与乘法函数不同;由于某种原因它被覆盖了。

2 个答案:

答案 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))]