matlab 向量关于矩阵的再正交化

szqfcxe2  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(412)

我有一个大小为50X6的矩阵A和一个大小为50X1的向量x。假设A的所有列彼此正交。我有两个问题:
1.检查x是否与A的所有列正交的最佳方法是什么?我能想到的唯一解决方案是迭代A的每一列,并计算点积。
1.假设从点积中我发现x与A的第3列和第5列不是正交的,那么我如何使x关于A的所有列正交化?
谢谢大家的关注。

wribegjk

wribegjk1#

1.检查x是否与A的每一列正交的最佳方法是,如您所说,检查每一列。幸运的是,矩阵乘法是所有数值计算中速度最快、优化程度最高的运算,所以A * x可能就足够快了!
1.关于#2,这是Gram-Schmidt正交化的基本思想。您只需减去由A的列表示的x部分。在代码中(抱歉,我只使用Numpy/Python,但同样的想法也适用于MatLab!):

import numpy as np

# just for demo purposes: build A and x
from scipy.linalg import qr # easy way to generate orthonormal columns
A = qr(np.random.randn(50, 6))[0][:, :6]
x = np.random.randn(50, 1)

# now, #1
is_x_orthogonal = np.allclose(A.T @ x, 0) # False :(

# and now, #2
newx = A @ (A.T @ x) - x

is_newx_orthogonal = np.allclose(A.T @ newx, 0) # True :D
lmvvr0a8

lmvvr0a82#

1.您需要计算XT.A,它是x转置和A的矩阵乘积。它将得到大小为6x1的行向量。如果结果向量的所有元素都为零,则x与A的所有列正交。
1.对于第二部分,你需要使用Graam Schmidt技巧,在你的情况下唯一特别的是很少有正交性计算项将为零,因为它们是正交的,

相关问题