2013-06-19 152 views
0

我试图做一些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") 

但在此行中我的代码:

R = multiply(Q_transpose, matrix) 

我得到这个错误:

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才能正常工作。

回答

1

你有没有transpose()return,让你返回None。所以你在做Q_transpose = None

+0

也许是这样,但转实际工作。我已经更新了我的问题请参考它。 – ratman2050

+0

@ Ratman2050你还会得到同样的错误? – 2rs2ts

+0

@ Ratman2050另外我看你键入'回报matrix' - 我认为你的意思'newmatrix'。 – 2rs2ts

1

因为它目前为您的转置()函数仍然返回一个无类型如果仍然得到同样的错误,并在转返回调换,但从来没有定义它。也许这是一个错字?

+0

哦,对了,我改变它返回矩阵,但你是什么意思它仍然返回None?它打印出的转我,当我打印Q_transpose – ratman2050

+0

什么是您目前收到的错误? – TheoretiCAL

+0

没关系,我发现它解决了错误。 – ratman2050