在线性代数中,格拉姆-斯密特过程应该是个比较基础的东西,一直都只是有个模糊的印象,不知道具体的操作,其实我以为这是个高大上的算法,没想到这个算法是这么地亲民。 格拉姆-斯密特过程是实现正交化的一个方法:给定矩阵 A ,若A中各列向量线性无关,则 A 可以产生一个正交矩阵Q,可以简单地将 Q 理解为各列向量之间互相垂直的矩阵。下面在二维平面上对这个过程进行具体的描述。
假设我们有两个线性无关的向量 a 和 b
我们想要他们垂直,其中 a⇒v1 , b⇒v2 假设 a 已经调整好了,我们将它的方向作为 q1 的方向 b 还没有进行调整: 我们希望它垂直于 q1下面的问题就是我们如何从 b 产生一个向量 v2 以满足 v2⊥v1=a
我们把 b 在 v1 进行投影, 然后我们可以得到 P⋅v1=vT1bvT1v1⋅v1 e 是我们的投影误差, 有 e=b−Pv1=b−Pv1=b−vT1bvT1v1⋅v1 注意 v2=e 有相同的长度和方向。所以 v2=b−vT1bvT1v1⋅v1 说明: 我们从原始向量 b 中移除(减去)平行部分分量 v1 , 然后剩下的就是垂直部分的分量。现在 v1⊥v2 我们可以简单检查一下: vT1v2=vT1(b−vT1bvT1v1⋅v1)=vT1b−vT1⋅vT1bvT1v1⋅v1=vT1b−vT1b=0
为了得到最终的结果,我们只需要对 v1 和 v2 进行单位化即可:
q1=v1/∥v1∥ q2=v2/∥v2∥假设我们有三个向量 a,b,c
我们需要找到三个两两互相垂直的向量 v1,v2,v3 ,然后对它们进行单位化由二维情形的讨论,我们可以首先令 v1=a , v2=b−vT1bvT1v1v1 下面我们需要找到 v3 ,满足 v3⊥v1 和 v3⊥v2 对于 v3 , 我们想要减去它沿着 v1 和 v2 方向的分量因此,我们有 v3=c−vT1cvT1v1⋅v1−vT2cvT2v2⋅v2得到 q1,q2,q3 之后,我们对其进行单位化(归一化):
q1=v1/∥v1∥ q2=v2/∥v2∥ q3=v3/∥v3∥由下面这个gif图,我们可以动态地看到变化的过程,更加直接
参考:http://0agr.ru/wiki/index.php/Gram-Schmidt_Process