使用 Numpy 优化矩阵正交到向量的投影
Optimized projection of a matrix orthogonaly to a vector with Numpy
我需要使矩阵的所有其他列 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 decomposition with the Gram-Schmidt process。
但由于 Gram-Schmidt 过程,此代码未优化且不稳定。
Numpy 是否提供任何方法来计算这些向量的正交投影?
使用户主矩阵
听说numpy.linalg.qr
用的是Householder Reflector。这将允许我计算一个正交矩阵 Q
以便
Q * A[:,j] = [0 ... 0 1 0 ... 0]
|
j_th coordinate
我只需要忽略行 j
并乘以 Q.T
。
有没有办法用Numpy得到Householder Matrix?我的意思是无需手动编写算法代码。
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]]
我需要使矩阵的所有其他列 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 decomposition with the Gram-Schmidt process。
但由于 Gram-Schmidt 过程,此代码未优化且不稳定。
Numpy 是否提供任何方法来计算这些向量的正交投影?
使用户主矩阵
听说numpy.linalg.qr
用的是Householder Reflector。这将允许我计算一个正交矩阵 Q
以便
Q * A[:,j] = [0 ... 0 1 0 ... 0]
|
j_th coordinate
我只需要忽略行 j
并乘以 Q.T
。
有没有办法用Numpy得到Householder Matrix?我的意思是无需手动编写算法代码。
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]]