矩阵乘法 Python - 矩阵行未分隔
Matrix Multiplication Python - Matrix rows not seperated
我目前正尝试在 python 上进行矩阵乘法运算,并且出现了正确的答案,但是,不是每一行都是独立的,而是将所有行合并为一行,然后重复行。
def matrixtranspose(m1):
mT = [[m1[i][x] for i in range(len(m1))] for x in range(len(m1[0]))]
return mT
def dotProduct(m1row, m2column):
l3 = [m1row[i] * m2column[i] for i in range(len(m1row))]
dP = sum(l3)
return dP
def matrixmult(m1, m2):
transposedMatrix = matrixtranspose(m2)
numRows = len(transposedMatrix)
newMatrix = []
addedDP = []
for rows in range(0, (len(m1))):
for col in range(0, len(transposedMatrix)):
addedDP.append(dotProduct(m1[rows], transposedMatrix[col]))
newMatrix.append(addedDP)
return newMatrix
这将 return:
[[4, 20, 4, 4, 20, 4, 6, 36, 6],
[4, 20, 4, 4, 20, 4, 6, 36, 6],
[4, 20, 4, 4, 20, 4, 6, 36, 6]]
而不是:
[[4, 20, 4] [4, 20, 4] [6, 36, 6]]
我该如何解决?
问题出在你的吸积逻辑上:
addedDP = []
for row in range(0, (len(m1))):
for col in range(0, len(transposedMatrix)):
addedDP.append(dotProduct(m1[row], transposedMatrix[col]))
您在遍历矩阵时将每个元素添加到 addedDP
:每个 产品都附加到全局值列表,而不仅仅是值当前行。 addedDP
不会为每个新行重置。然后,对于矩阵中的每一行:
newMatrix.append(addedDP)
您将原始引用添加到整个列表。因此,当您完成后,您的 "result" 列表中就有了该列表的 len(m1)
个副本。
您可以通过为每一行重新初始化 addedDP
来解决此问题:
newMatrix = []
for row in range(0, (len(m1))):
addedDP = []
for col in range(0, len(transposedMatrix)):
addedDP.append(dotProduct(m1[row], transposedMatrix[col]))
# print("row, col:", row, col, addedDP)
newMatrix.append(addedDP)
# print("row", row, addedDP)
return newMatrix
我在调试中留下了 print
语句。我强烈建议您学习这个基本的调试工具:如果您的程序有问题,询问 它哪里出了问题! :-)
请参阅这个可爱的 debug 博客寻求帮助。
给定一个主程序:
m1 = [[1, 2],
[3, 4]]
m2 = [[0, 1],
[-1, 0]]
print(matrixmult(m1, m2))
启用 print
语句的输出:
row, col: 0 0 [-2]
row, col: 0 1 [-2, 1]
row 0 [-2, 1]
row, col: 1 0 [-4]
row, col: 1 1 [-4, 3]
row 1 [-4, 3]
[[-2, 1], [-4, 3]]
我目前正尝试在 python 上进行矩阵乘法运算,并且出现了正确的答案,但是,不是每一行都是独立的,而是将所有行合并为一行,然后重复行。
def matrixtranspose(m1):
mT = [[m1[i][x] for i in range(len(m1))] for x in range(len(m1[0]))]
return mT
def dotProduct(m1row, m2column):
l3 = [m1row[i] * m2column[i] for i in range(len(m1row))]
dP = sum(l3)
return dP
def matrixmult(m1, m2):
transposedMatrix = matrixtranspose(m2)
numRows = len(transposedMatrix)
newMatrix = []
addedDP = []
for rows in range(0, (len(m1))):
for col in range(0, len(transposedMatrix)):
addedDP.append(dotProduct(m1[rows], transposedMatrix[col]))
newMatrix.append(addedDP)
return newMatrix
这将 return:
[[4, 20, 4, 4, 20, 4, 6, 36, 6],
[4, 20, 4, 4, 20, 4, 6, 36, 6],
[4, 20, 4, 4, 20, 4, 6, 36, 6]]
而不是:
[[4, 20, 4] [4, 20, 4] [6, 36, 6]]
我该如何解决?
问题出在你的吸积逻辑上:
addedDP = []
for row in range(0, (len(m1))):
for col in range(0, len(transposedMatrix)):
addedDP.append(dotProduct(m1[row], transposedMatrix[col]))
您在遍历矩阵时将每个元素添加到 addedDP
:每个 产品都附加到全局值列表,而不仅仅是值当前行。 addedDP
不会为每个新行重置。然后,对于矩阵中的每一行:
newMatrix.append(addedDP)
您将原始引用添加到整个列表。因此,当您完成后,您的 "result" 列表中就有了该列表的 len(m1)
个副本。
您可以通过为每一行重新初始化 addedDP
来解决此问题:
newMatrix = []
for row in range(0, (len(m1))):
addedDP = []
for col in range(0, len(transposedMatrix)):
addedDP.append(dotProduct(m1[row], transposedMatrix[col]))
# print("row, col:", row, col, addedDP)
newMatrix.append(addedDP)
# print("row", row, addedDP)
return newMatrix
我在调试中留下了 print
语句。我强烈建议您学习这个基本的调试工具:如果您的程序有问题,询问 它哪里出了问题! :-)
请参阅这个可爱的 debug 博客寻求帮助。
给定一个主程序:
m1 = [[1, 2],
[3, 4]]
m2 = [[0, 1],
[-1, 0]]
print(matrixmult(m1, m2))
启用 print
语句的输出:
row, col: 0 0 [-2]
row, col: 0 1 [-2, 1]
row 0 [-2, 1]
row, col: 1 0 [-4]
row, col: 1 1 [-4, 3]
row 1 [-4, 3]
[[-2, 1], [-4, 3]]