我正在尝试使用嵌套的while循环对给定的硬编码矩阵进行矩阵乘法...
对此的正确答案应为[[6,12],[15,30],[24,48]]
但我的代码输出是[[6,12],[6,12],[6,12]]
我该怎么办?
a=[[1,2,3],[4,5,6],[7,8,9]]
b=[[1,2],[1,2],[1,2]]
c=[]
cola=len(a)
rowa=len(a[0])
colb=len(b)
rowb=len(b[0])
r,s,t,u,sum = 0,0,0,0,0
c=[([0]*rowb)]*cola
print c
while s<cola:
while u<rowb:
while t<colb:
d=a[s][t]*b[t][r]
sum+=d
t+=1
c[s][r]=sum
sum=0
u+=1
t=0
r+=1
r=0
s+=1
print c
答案 0 :(得分:1)
当你这样做时 -
c=[([0]*rowb)]*cola
您只是复制内部列表cola
次,这是浅层复制,因此每个内部列表都是对同一对象的引用,因此当您更改其中一个内部列表中的元素时,它会影响所有内容内部清单。而不是那样,尝试使用列表推导来创建c
列表。
示例 -
c = [[0 for _ in range(rowb)] for _ in range(cola)]
此外,您的逻辑中的另一个小问题是,您使用r
来表示来自b
的元素,但是在您检查的while循环中 - u
,您应该检查反对r
。示例 -
while s<cola:
while r<rowb:
答案 1 :(得分:0)
#!/usr/bin/env python
#-*- coding: utf-8 -*-
matrixA = [[1,2,3],[4,5,6],[7,8,9]]
matrixB = [[1,2],[1,2],[1,2]]
result = []
for row in range(len(matrixA)):
rowResult = []
for column in range(len(matrixB[0])):
s = 0
l = len(matrixA[row])
for i in range(l):
s += matrixA[row][i]*matrixB[i][column]
rowResult.append(s)
result.append(rowResult)
print result
我试试这个,这是正确的。