首页 > 技术文章 > 线性变换

back-to-the-past 2019-11-04 00:29 原文

什么是线性变换?

假设有一数学函数\(f\),使得三维向量\(\vec v=(x,y,z)\),有\(f(\vec v) = f(x, y, z) = (x',y',z')\)。那么,如果\(f\)满足:

  1. \(f(\vec u + \vec v) = f(\vec u) + f(\vec v)\)
  2. \(f(k \vec v) = kf(\vec v)\)

那么,称\(f\)为线性变换。

线性变换的矩阵表示

\[\begin{align*} f(\vec v) &= f(x \vec i + y \vec j + z \vec k) \\ &= f(x \vec i) + f(y \vec j) + f(z \vec k) \\ &= xf(\vec i) + yf(\vec j) + zf(\vec k) \\ &= [x, y, z] \cdot \begin{bmatrix} f(\vec i) \\ f(\vec j) \\ f(\vec k) \end{bmatrix} \end{align*} \]

缩放变换

易知,缩放变换\(S(\vec v) = S(x, y, z) = (s_x x, s_y y, s_z z)\)。那么,我们尝试证明一下它是线性变换:

\[\begin{align*} S(\vec u + \vec v) &= S(u_x+v_x, u_y+v_y, u_z+v_z) \\ &= (s_x(u_x+v_x), s_y(u_y+v_y), s_z(u_z+v_z)) \\ &= (s_xu_x + s_xv_x, s_yu_y + s_yv_y, s_zu_z + s_zv_z) \\ &= (s_xu_x, s_yu_y, s_zu_z) + (s_xv_x, s_yv_y, s_zv_z) \\ &= S(\vec u) + S(\vec v) \end{align*} \]

\[\begin{align*} S(k\vec v) &= S(kv_x, kv_y, kv_z) \\ &= (ks_xv_x, ks_yv_y, ks_zv_z) \\ &= k(s_xv_x, s_yv_y, s_zv_z) \\ &= kS(\vec v) \end{align*} \]

综上,我们证明了缩放变换是线性变换。由之前线性变换的矩阵表示,我们可以推导缩放变换的矩阵表示为

\[\begin{bmatrix} S(\vec i) \\ S(\vec j) \\ S(\vec k) \end{bmatrix} = \begin{bmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & s_z \end{bmatrix} \]

旋转变换

我们定义旋转变换为将一个向量\(\vec v\)绕任意轴\(\vec n\)顺时针旋转\(\theta\)角度,如图所示:

由图可知,我们要求的就是将向量\(\vec v\)绕向量\(\vec n\)旋转\(\theta\)角度后得到的\(\vec v'\)。首先,我们注意到在旋转过程中,与旋转轴平行的向量是不参与旋转过程的,只有与旋转轴垂直的向量在真正旋转。因此可以将向量\(\vec v\)分解为与\(\vec n\)平行的向量\(\vec v_\parallel\)和垂直的向量\(\vec v_\perp\)。即:

\[\vec v = \vec v_\parallel + \vec v_\perp \]

那么

\[\vec v' = \vec v_\parallel + \vec v'_\perp \]

其中,平行向量\(\vec v_\parallel\)是向量\(\vec v\)在旋转轴\(\vec n\)上的投影。这里假定,旋转轴向量\(\vec n\)是归一化过的,即单位向量。由向量投影的定义,可得到

\[\vec v_\parallel = (\vec v \cdot \vec n) \vec n \]

进而可得

\[\vec v_\perp = \vec v - \vec v_\parallel = \vec v - (\vec v \cdot \vec n) \vec n \]

接下来,我们只要求得旋转后的\(\vec v'_\perp\)即可。注意到已知的\(\vec v_\perp\),且这两个向量都位于同一个圆的旋转平面上,因此只要再得到一个垂直于\(\vec v_\perp\)的向量\(\vec w\),且向量\(\vec w\)与这两个向量共面,就可以通过旋转角度\(\theta\)算出向量\(\vec v'_\perp\)了:

\[\vec v'_\perp = \vec v_\perp \cdot cos\theta + \vec w \cdot sin\theta \]

那么,怎样的\(\vec w\)是满足以上条件的呢?注意到向量的叉积的几何意义:两向量的叉积后得到的向量与这两个向量是垂直的。所以,我们令

\[\vec w = \frac{|\vec v_\perp|}{|\vec n \times \vec v|} \cdot (\vec n \times \vec v) \]

向量前面的系数是为了让向量的模与\(\vec v_\perp\)相等。这样就求出了满足条件的\(\vec w\)。特别地,由向量叉积的定义,可以将上式简化为

\[\vec w = \frac{|\vec v_\perp|}{|\vec n| |\vec v| sin\theta} \cdot \ (\vec n \times \vec v) \]

由图可知,\(|\vec v_\perp| = |\vec v| sin\theta\),而向量\(\vec n\)是单位向量,所以得到:

\[\vec w = \vec n \times \vec v \]

综合以上若干等式,求出最终的\(\vec v'\)

\[\vec v' = (\vec v \cdot \vec n) \vec n + (\vec v - (\vec v \cdot \vec n) \vec n)cos\theta + (\vec n \times \vec v)sin\theta \]

回到线性变换的定义来,旋转变换\(R(\vec v) = R(x, y, z)\)。将其代入上式,可以得到

\[R(x,y,z) = (r_{11}x + r_{21}y + r_{31}z, r_{12}x + r_{22}y + r_{32}z, r_{13}x + r_{23}y + r_{33}z) \]

根据线性变换的定义,容易证明旋转变换是一种线性变换。那么,旋转变换的矩阵表示为:

\[\begin{bmatrix} R(\vec i) \\ R(\vec j) \\ R(\vec k) \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} = \begin{bmatrix} c + (1 - c)x^2 & (1-c)xy + sz & (1-c)xz - sy \\ (1-c)xy - sz & c+(1-c)y^2 & (1-c)yz + sx \\ (1-c)xz + sy & (1-c)yz - sx & c+(1-c)z^2 \end{bmatrix} \]

其中,\(c=cos\theta, s = sin\theta, x,y,z\)分别为向量\(\vec n\)的三个分量。

推荐阅读