Python 矩阵乘法的麻烦

Python 矩阵乘法的麻烦,python,list,linear-algebra,Python,List,Linear Algebra,我正在尝试对可选作业进行QR分解,但我没有使用numpy: def multiply(matrix1, matrix2): rows_A = len(matrix1) cols_A = len(matrix1[0]) rows_B = len(matrix2) cols_B = len(matrix2[0]) new_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)]

我正在尝试对可选作业进行QR分解,但我没有使用numpy:

def multiply(matrix1, matrix2):
    rows_A = len(matrix1)
    cols_A = len(matrix1[0])
    rows_B = len(matrix2)
    cols_B = len(matrix2[0])

    new_matrix = [[0 for row in range(cols_B)] for col in range(rows_A)]

    for i in range(len(matrix1)):
        for j in range(len(matrix2[0])):
            for k in range(len(matrix2)):
                new_matrix[i][j] += matrix1[i][k]*matrix2[k][j]
    return new_matrix

def transpose(matrix):
    newmatrix = []
    for i in range(len(matrix)):
        newline = []
        for j in range(len(matrix[i])):
            newline.append(matrix[j][i])
        newmatrix.append(newline)
    for k in range(len(newmatrix)):
        print(newmatrix[k])
    return matrix

# Returns the Gramm-Schmidt orthogonalization of matrix X
def gramm_schmidt(X, inplace = False):
    if not inplace:
       V = [row[:] for row in X]  # make a copy.
    else:
       V = X
    k = len(X[0])          # number of columns. 
    n = len(X)             # number of rows.

    for j in range(k):
       for i in range(j):
          # D = < Vi, Vj>
          D = sum([V[p][i]*V[p][j] for p in range(n)])

          for p in range(n): 
            # Note that the Vi's already have length one!
            # Vj = Vj - <Vi,Vj> Vi/< Vi,Vi >
            V[p][j] -= (D * V[p][i])

       # Normalize column V[j]
       invnorm = 1.0 / sqrt(sum([(V[p][j])**2 for p in range(n)]))
       for p in range(n):
           V[p][j] *= invnorm
    return V

def QR(matrix):
    Q = gramm_schmidt(matrix)
    Q_transpose = transpose(Q)
    R = multiply(Q_transpose, matrix)
    QR = multiply(Q, R)

    print ("Q:\n")
    for row in Q:
        print (row)
    print ("\n")

    print ("R:\n")
    for row in R:
        print (row)
    print ("\n")

    print ("QR:\n")
    for row in QR:
        print (row)
    print ("\n")
我得到这个错误:

    rows_A = len(matrix1)
TypeError: object of type 'NoneType' has no len()
我不知道为什么,因为当我做标准乘法时,乘法函数本身就可以工作……如果有人能帮忙,请提前感谢

编辑:我在转置中添加了一个return语句,是的,它确实给出了一个转置矩阵。看来是乘法运算造成的。以下是它应该做的:

 A:
        [[12, -51, 4],
        [6, 167, -68], 
        [-4, 24, -41]]
Q:
    [[0.8571428571428571, 0.39428571428571435, -0.33142857142857135],
     [0.4285714285714286, -0.9028571428571429, 0.034285714285714114],
     [-0.28571428571428575, -0.17142857142857126, -0.942857142857143]]
R:
    [[13.999999999999998, 21.00000000000001, -14.000000000000004],
     [-5.506706202140776e-16, -175.00000000000003, 70.0],
     [3.0198066269804245e-16, -3.552713678800501e-14, 35.000000000000014]]

但是我只能让Q正常工作。

transpose()
中没有
return
,所以返回
None
。因此,您正在执行
Q_transpose=None

,因为当前情况下,如果您仍然收到相同的错误,那么transpose()函数仍然返回None类型,并且在转置中返回转置,但从未定义它。也许这是一个输入错误?

可能是这样,但转置确实有效。我已经更新了我的问题,请参考。@Ratman2050我还看到你键入了
返回矩阵
-我想你的意思是
新矩阵
。哦,对了,我把它改成了返回矩阵,但你说它仍然没有返回是什么意思?当我打印Q_转置时,它会为我打印转置
 A:
        [[12, -51, 4],
        [6, 167, -68], 
        [-4, 24, -41]]
Q:
    [[0.8571428571428571, 0.39428571428571435, -0.33142857142857135],
     [0.4285714285714286, -0.9028571428571429, 0.034285714285714114],
     [-0.28571428571428575, -0.17142857142857126, -0.942857142857143]]
R:
    [[13.999999999999998, 21.00000000000001, -14.000000000000004],
     [-5.506706202140776e-16, -175.00000000000003, 70.0],
     [3.0198066269804245e-16, -3.552713678800501e-14, 35.000000000000014]]