一种函数,它以两个矩阵作为输入,并在Python中返回一个带A*B的矩阵
我想知道如何创建点积矩阵。以下是我迄今为止编写的代码:一种函数,它以两个矩阵作为输入,并在Python中返回一个带A*B的矩阵,python,vector,matrix,multiplication,Python,Vector,Matrix,Multiplication,我想知道如何创建点积矩阵。以下是我迄今为止编写的代码: C = [[4,1,9], [6,2,8], [7,3,5]] D = [[2,9], [5,2], [1,0]] def prettyPrint(A): for i in range(len(A)): line = "{0: >7}".format("|"+str(A[i][0])) for j in range(1, len(A[i])): line = line
C = [[4,1,9], [6,2,8], [7,3,5]]
D = [[2,9], [5,2], [1,0]]
def prettyPrint(A):
for i in range(len(A)):
line = "{0: >7}".format("|"+str(A[i][0]))
for j in range(1, len(A[i])):
line = line + "{0: >7}".format(str(A[i][j]))
line = line + "|"
print(line)
#for addition of vectors
def matrixADD(A,B):
Z = []
for i in range(len(A)):
row = []
for j in range(len(A[0])):
row.append(A[i][j]+B[i][j])
Z.append(row)
return Z
#for subtraction of vectors
def matrixSUB(A,B):
Z = []
for i in range(len(A)):
row = []
for j in range(len(A[0])):
row.append(A[i][j]-B[i][j])
Z.append(row)
return Z
#for multiplication of vectors
def row(A,i):
Z = []
Z.extend(A[i])
return Z
def col(B,j):
Z = []
for row in B:
Z.append(row[j])
return Z
def dotProduct(x,y):
prod = 0
prod = sum(p*q for p,q in zip(x,y))
return prod
def matrixMUL(A,B):
Z = []
#Need to do.
return Z
print("\nC * D:")
prettyPrint(matrixMUL(C,D))
这是我遇到麻烦的matrixMUL(A,B)
部分。
程序应该经过这种计算:
例如:
然后只打印以下语句:
C * D:
|22 38|
|30 58|
|34 69|
我需要使用其他树(或三个?不知道是否有输入错误)函数。
在过去的三天里,我一直在尝试这个方法,并且已经查阅了所有我能想到的东西。这是我尝试过的一些失败的代码(我只是注释掉出错的部分):
我不知道我还能尝试什么。有人能帮忙吗?你可以这样做:
def matrixMUL(A,B):
Z = [[0] * len(B[0]) for zz in range(len(A))]
for i in range(0,len(A)):
a = row(A,i)
for j in range(0,len(B[0])):
b = col(B,j)
Z[i][j] = sum(p*q for p,q in zip(a,b))
return Z
我在编写这样的代码时遇到的一个困难是首先正确初始化矩阵
如果我们使用像Z=[[0]*len(B[0])]*len(A)
这样的代码,那么我们最终会创建一个包含len(A)
引用相同长度len(B[0])
零列表的Z
。因此,像z[0][0]=1
这样的代码看起来会“神奇地”将z[1][0]
和z[2][0]
同时变为等于1
,因为所有这些代码都引用同一列表中的同一元素
通过使用如上所示的列表理解初始化矩阵Z
,我们可以确保有一组在Z
中提到的唯一列表
避免初始化所有Z
(从而完全避免列表引用问题)的另一种方法是:
这两个函数都没有进行应有的错误检查(例如,检查矩阵是否具有乘法所需的相应维数),因此它们尚未达到良好的生产代码标准。此外,正如评论中所建议的,如果
numpy
可用,我强烈建议使用numpy
,而不是为此编写自己的代码。您不想使用numpy有什么原因吗?如果没有,你应该看一看。它提供了大量的数组操作例程,包括点积和叉积!!!!!!谢谢谢谢谢谢谢谢!!!!我一辈子都想不出来。我没有使用r.append(sum(p*q代表p,zip(a,b))而是使用r.append(dotProduct(a,b))
。天哪,你真棒,先生。我真的爱你。
def matrixMUL(A,B):
Z = []
Z.append(int(dotProduct(row(A,B),col(A,B))))
#if len(col(B,j)) != len(row(A,i)):
#print("Cannot multiply the two matrices. Incorrect dimensions.")
#else:
#for n in range(row(A,i)):
#for m in range(col(B,j)):
#Z.append(dotProduct(x,y))
return Z
#mult = sum(p*q for p,q in zip(x,y))
#Z.append(mult)
#Z = []
#for i in range(len(A)):
#row = []
#for j in range(len(A[0])):
#row.append(A[i][j]+B[i][j])
#Z.append(row)
#return Z
def matrixMUL(A,B):
Z = [[0] * len(B[0]) for zz in range(len(A))]
for i in range(0,len(A)):
a = row(A,i)
for j in range(0,len(B[0])):
b = col(B,j)
Z[i][j] = sum(p*q for p,q in zip(a,b))
return Z
def matrixMUL2(A,B):
Z = []
for i in range(0,len(A)):
a = row(A,i)
r = []
for j in range(0,len(B[0])):
b = col(B,j)
r.append(sum(p*q for p,q in zip(a,b)))
Z.append(r)
return Z