向量正交化(Orthogonalization)

403 阅读3分钟

最近在学习计算机图形学,遇到了一些基本的数学知识,在此做一下记录。

在图形学中经常会遇到这样的情况:一开始的时候我们有一组标准正交基,但是由于数值计算的精度问题,这组向量在计算过程中会失去标准正交的特性。这时候,我们需要把这组接近标准正交的向量标准正交化。

施密特正交化(Gram-Schmidt Orthogonalization)

对于向量 n → " role="presentation" style="position: relative;">\vec n 和 v → " role="presentation" style="position: relative;">\vec v,定义 v → " role="presentation" style="position: relative;">\vec v 在 n → " role="presentation" style="position: relative;">\vec n 上的正交投影

p → = p r o j n → ( v → ) = ( v → ⋅ n → ‖ n → ‖ ) ⋅ n → ‖ n → ‖ = v → ⋅ n → ‖ n → ‖ n → " role="presentation" style="text-align: center; position: relative;">p ⃗  =p roj n ⃗  (v ⃗  )= (v ⃗  ⋅n ⃗  ∥ n ⃗  ∥ ) ⋅n ⃗  ∥ n ⃗  ∥ = v ⃗  ⋅ n ⃗  ∥ n ⃗  ∥ n ⃗  p → = p r o j n → ( v → ) = ( v → ⋅ n → ‖ n → ‖ ) ⋅ n → ‖ n → ‖ = v → ⋅ n → ‖ n → ‖ n →

对于 n" role="presentation" style="position: relative;">n 个向量的集合 { v → 0 , v → 1 , … , v → n − 1 } " role="presentation" style="position: relative;">\left\{ \vec v_0, \vec v_1,…, \vec v_{n-1} \right\},应用下述的施密特正交化过程(Gram-Schmidt Orthogonalization)可将其转化为一组标准正交基 { w → 0 , w → 1 , … , w → n − 1 } " role="presentation" style="position: relative;">\left\{ \vec w_0, \vec w_1, …, \vec w_{n-1} \right\}

  1. 令 w → 0 = v → 0   ;" role="presentation" style="position: relative;">\vec w_0 = \vec v_0 \ ;
  2. 对 1 ≤ i ≤ n − 1" role="presentation" style="position: relative;">1 \le i \le n-1,令
    w → i = v → i − ∑ j = 0 i − 1 p r o j w → j ( v → i )   ;" role="presentation" style="text-align: center; position: relative;">w ⃗  i =v ⃗  i −∑ j =0 i −1 p roj w ⃗  j (v ⃗  i )  ; w→i=v→i−∑j=0i−1projw→j(v→i) ;
  3. 标准化:
    w → i = w → i ‖ w → i ‖   ." role="presentation" style="text-align: center; position: relative;">w ⃗  i =w ⃗  i ∥ w ⃗  i ∥  . w→i=w→i‖w→i‖ .

使用叉积标准正交化三维向量集合

对于三维的向量,可以利用叉积的特性来实现标准正交化:对于三维向量的集合 { v → 0 , v → 1 , v → 2 } " role="presentation" style="position: relative;">\left\{ \vec v_0, \vec v_1, \vec v_2 \right\},可按下述步骤将其转化为一组标准正交基 { w → 0 , w → 1 , w → 2 } " role="presentation" style="position: relative;">\left\{ \vec w_0, \vec w_1, \vec w_2 \right\}

  1. 令 w → 0 = v → 0 / ‖ v → 0 ‖   ;" role="presentation" style="position: relative;">\vec w_0 = \vec v_0 / \left\Vert \vec v_0 \right\Vert  \ ;

  2. w → 2 = w → 0 × v → 1 ‖ w → 0 × v → 1 ‖   ;" role="presentation" style="text-align: center; position: relative;">w ⃗  2 =w ⃗  0 ×v ⃗  1 ∥ w ⃗  0 ×v ⃗  1 ∥  ; w→2=w→0×v→1‖w→0×v→1‖ ;
  3. 令 w → 1 = w → 2 × w → 0   ." role="presentation" style="position: relative;">\vec w_1 = \vec w_2 \times \vec w_0 \ .

其他注意事项

可以看到,在上述两种标准正交化方法中,第一步都是从已有的向量集中选取一个向量直接加入到结果集中,这个被选取的向量在转化前后的方向保持不变。在图形学的应用中,这个方向保持不变的向量的选择有时候是很重要的,比如在摄像机的取向问题上,我们一般希望能保持摄像机所看向的方向保持不变,这时就应该选择摄像机看向的方向作为该向量。我们应当根据特定的应用需求,正确地选择这个方向保持不变的向量。

参考文献