我试图做一些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才能正常工作。
也许是这样,但转实际工作。我已经更新了我的问题请参考它。 – ratman2050
@ Ratman2050你还会得到同样的错误? – 2rs2ts
@ Ratman2050另外我看你键入'回报matrix' - 我认为你的意思'newmatrix'。 – 2rs2ts