Я скопировал ваш исходный код, чтобы я мог сравнить ответы, чтобы убедиться, что математика сработала. Я считаю, что эта функция возвращает тот же ответ, который вычисляет ваш код.
def removeOrthos(Arr, N, l):
remove = 0
for i in range(N):
remove -= np.dot(Arr[N], Arr[i]) * Arr[i]
ortho = Arr[N] + remove
l[N] += np.log(np.linalg.norm(ortho))
return ortho / np.linalg.norm(ortho)
Вот ваш оригинальный код со сравнениями с моей функцией и linalg.qr ()
def ortho():
N = 3 # 'Numer of rows and columns. In my real case N is equal to 100'
l1, l2, l3 = 0, 0, 0 # 'Quantities that i want to compute. Again in my case i have 100s of them l1, l2,...,l100'
L = np.zeros(N)
for t in range(10**3): #'Simulate Computation'
#''' for i in range(10**5):
#Computation where i compute Matrix A with its vectors A[0], A[1]... '''
A = np.random.rand(N, N) #'A is generated randomly to keep the code short'
#'Apply the Gram-Schmidt-Scheme on the vectors A[0], A[1], A[2]. Again in my case i have 100 vectors'
B = np.copy(A)
for b in range(N):
B[b] = removeOrthos(B, b, L)
Q,R = np.linalg.qr(np.copy(A).T)
orth_1 = A[0]
l1 += np.log(np.linalg.norm(orth_1))
A[0] = orth_1 / np.linalg.norm(orth_1)
orth_2 = A[1] - np.dot(A[1], A[0]) * A[0] #'Remove any A[0] components from A[1]'
l2 += np.log(np.linalg.norm(orth_2)) # 'Store the values that i want to compute later'
A[1] = orth_2 / np.linalg.norm(orth_2)
orth_3 = A[2] - (np.dot(A[2], A[1]) * A[1]) - (np.dot(A[2], A[0]) * A[0]) #'Remove any A[0] and A[1] components from A[2]'
l3 += np.log(np.linalg.norm(orth_3))
A[2] = orth_3 / np.linalg.norm(orth_3)
print(l1,l2,l3, L)
return A, B, Q, R
Ниже обратите внимание на условие False в [2,0], хотя реальные цифры выглядят как совпадение, должна быть некоторая ошибка округления за пределами 7 знаков после запятой.
>>> A, B, Q, R = ortho()
-74.2981307378 -838.247442533 -1628.34240096 [ -74.29813074 -838.24744253 -1628.34240096]
>>> A==B
array([[ True, True, True],
[ True, True, True],
[False, True, True]], dtype=bool)
>>> A
array([[ 0.01225148, 0.554242 , 0.8322654 ],
[ 0.99376938, -0.09896161, 0.05127395],
[ 0.1107805 , 0.82645169, -0.55200116]])
>>> B
array([[ 0.01225148, 0.554242 , 0.8322654 ],
[ 0.99376938, -0.09896161, 0.05127395],
[ 0.1107805 , 0.82645169, -0.55200116]])
>>> A==Q
array([[False, False, False],
[False, False, False],
[False, False, False]], dtype=bool)
>>> Q
array([[-0.01225148, 0.99376938, -0.1107805 ],
[-0.554242 , -0.09896161, -0.82645169],
[-0.8322654 , 0.05127395, 0.55200116]])