Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
一种函数,它以两个矩阵作为输入,并在Python中返回一个带A*B的矩阵_Python_Vector_Matrix_Multiplication - Fatal编程技术网

一种函数,它以两个矩阵作为输入,并在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