【问题标题】:Creating a zero matrix for matrix multiplication not working despite when creating the matrix via a loop尽管通过循环创建矩阵,但为矩阵乘法创建零矩阵不起作用
【发布时间】: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]。您可以像这样复制rowP.append(row[:])
  • 感谢您的反馈。我修复了空矩阵函数。现在工作正常。
  • @Nasser 但是你犯的错误是一个非常重要的理解。我建议您仔细阅读该链接中的答案。
  • 我认为在这种情况下您不应该使用名为 X 的变量和其他名为 x 的变量,因为这会导致误解。

标签: python arrays matrix matrix-multiplication


【解决方案1】:

我让它工作了。我使用嵌套列表推导来创建零矩阵。我认为只是将零列表添加为行以前不起作用并且弄乱了维度或列表类型。

修改后的空函数:

def empty(X,Y):
 P=[]
 P= [[0 for i in range(len(Y[0]))] for j in range(len(X))]
 return P

【讨论】:

  • 您的原始代码错误,因为您的矩阵的所有行都指向同一个列表。所以如果你改变了一个,你就改变了他们。此外,P=[] 也是不必要的,因为无论如何列表理解都会创建一个新列表。
【解决方案2】:

补充Nasseranswer

你可以像这样实现你的函数,这样你就不需要变量P

def empty(X,Y):
    return [[0 for i in range(len(Y[0]))] for j in range(len(X))]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多