Оптимизированная проекция матрицы ортогональности на вектор с Numpy - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно сделать все остальные столбцы матрицы A ортогональными одному из ее столбцов j.

Я использую следующий алгоритм:

# Orthogonalize with selected column
for i in remaining_cols:
    A[:,i] = A[:,i] - A[:,j] * np.dot(A[:,i], A[:,j]) / np.sum(A[:,j]**2)

Идея приходитиз QR-разложения с процессом Грамма-Шмидта .

Но этот код не оптимизирован и нестабилен из-за процесса Грамма-Шмидта.

Предоставляет ли Numpy какой-либо метод?вычислить ортогональную проекцию этих векторов?


С матрицей домохозяев

Я слышал, что отражатели домовладельцев используются в numpy.linalg.qr.Это позволило бы мне вычислить ортогональную матрицу Q, чтобы

Q * A[:,j] = [0 ... 0 1 0 ... 0]
                      |
                 j_th coordinate

Мне пришлось бы только игнорировать строку j и умножить обратно на Q.T.

Есть лиспособ получить матрицу домохозяина с Numpy?Я имею в виду, не кодируя алгоритм вручную.

1 Ответ

1 голос
/ 28 мая 2019

IIUC, здесь может быть векторизация:

np.random.seed(10)
B = np.random.rand(3,3)

col = 0
remaining_cols = [1,2]

#your method
A = B.copy()
for i in remaining_cols:
    A[:,i] = A[:,i] - A[:,col] * np.dot(A[:,i], A[:,col]) / np.sum(A[:,col]**2)
print (A)
[[ 0.77132064 -0.32778252  0.18786796]
 [ 0.74880388  0.16014712 -0.2079702 ]
 [ 0.19806286  0.67103261  0.05464156]]

# vectorize method
A = B.copy()
A[:,remaining_cols] -= (A[:,col][:,None] * np.sum(A[:,remaining_cols]* A[:,col][:,None], axis=0)
                                              / np.sum(A[:,col]**2))

print (A) #same result
[[ 0.77132064 -0.32778252  0.18786796]
 [ 0.74880388  0.16014712 -0.2079702 ]
 [ 0.19806286  0.67103261  0.05464156]]
...