python问题中的矩阵乘法及其生成结果

2024-04-24 22:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我需要乘两个矩阵

我引用的代码不是我的,但我想了解:

# Program to multiply two matrices using nested loops

# 3x3 matrix
X = [[12,7,3],
    [4 ,5,6],
    [7 ,8,9]]
# 3x4 matrix
Y = [[5,8,1,2],
    [6,7,3,0],
    [4,5,9,1]]
# result is 3x4
x = len(X)
y = len(Y[0])
result = []
resultx = []
for each in range(1,y+1):
    resultx.append(0)
for each in range(1,x+1):
    result.append(resultx)

# iterate through rows of X
for i in range(len(X)):
# iterate through columns of Y
    for j in range(len(Y[0])):
        # iterate through rows of Y
        for k in range(len(Y)):
            result[i][j] += X[i][k] * Y[k][j]

for r in result:
    print(r)

代码的作者正在创建如下代码中的结果:

result = [[0,0,0,0],
     [0,0,0,0],
     [0,0,0,0]]

我尝试用两个for循环创建它:

x = len(X)
y = len(Y[0])
result = []
resultx = []
for each in range(1,y+1):
    resultx.append(0)
for each in range(1,x+1):
    result.append(resultx)

输出是相同的,甚至类型(结果)也是相同的。 但最终的解决方案是不同的。 所以我的问题是为什么我的最终结果是

[307, 414, 245, 64],[307, 414, 245, 64],[307, 414, 245, 64]

正确的解决方案是:

[114, 160, 60, 27],[74, 97, 73, 14,[119, 157, 112, 23]

我意识到114+74+119等于307

我的问题: 为什么我如何创建结果矩阵或我做错了什么很重要? 编辑: 要澄清问题:

result = [[0,0,0,0],[0,0,0,0],[0,0,0,0]]

最终的解决方案是:[114, 160, 60, 27],[74, 97, 73, 14,[119, 157, 112, 23]

当我尝试创建0矩阵时:而不是硬编码它:

x = len(X)
y = len(Y[0])
result = []
resultx = []
for each in range(1,y+1):
    resultx.append(0)
for each in range(1,x+1):
    result.append(resultx)

解决方案是:[307, 414, 245, 64],[307, 414, 245, 64],[307, 414, 245, 64]


Tags: of代码inforlenrange矩阵result
2条回答

问题在于,在代码中,当您尝试在此for循环中创建0矩阵时:

for each in range(1,x+1):
    result.append(resultx)

您将一个名为“resultx”的对象附加到另一个名为“result”的对象上3次,但这是内存中的一个对象,因此基本上有3个相同的行。例如,当您在操作结果[0][0]时,实际上您也在操作结果[0][1]和结果[0][2]。您应该这样更改代码,以便每次创建具有相同名称“resultx”的新对象时:

result = []
for each in range(1,x+1):
    resultx = []
    for each in range(1,y+1):
        resultx.append(0)
    result.append(resultx)

不错的尝试!!! 但是,如果您想将两个矩阵相乘,则需要对每个索引(mat1=m,n和mat2=n,x)按行和列进行旅行(mat1=m,n和mat2=n,x,那么结果将是m,x),因此需要三个循环,如下所述

  1. 移动到m,x(合成矩阵)
  2. 为行乘法而旅行
  3. 为列乘法而移动

另一个解决方案

result = np.dot(A,B)

相关问题 更多 >