0

我需要使矩阵的所有其他列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)

这个想法来自使用 Gram-Schmidt 过程的 QR 分解

但是由于 Gram-Schmidt 过程,此代码未优化且不稳定。

Numpy 是否提供任何方法来计算这些向量的正交投影?


户主矩阵

听说 Householder Reflector 用在numpy.linalg.qr. 这将允许我计算一个正交矩阵Q,以便

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

我只需要忽略这条线j并乘回Q.T.

有没有办法用 Numpy 获得 Householder Matrix ?我的意思是不手动编码算法。

4

1 回答 1

1

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]]
于 2019-05-28T14:02:35.220 回答