跳至主要內容

矩阵

LincZero大约 7 分钟

矩阵

目录

矩阵

概念

定义

  • 矩阵matrix
  • 列矩阵column matrix
  • 行矩阵raw matrix

几何意义:变换

  • 齐次坐标

运算定义

矩阵与标量的乘法

kM=Mk=k[m11m12m13m21m22m23m31m32m33]=[km11km12km13km21km22km23km31km32km33] kM=Mk= k\begin{bmatrix} m_{11}&m_{12}&m_{13}\\ m_{21}&m_{22}&m_{23}\\ m_{31}&m_{32}&m_{33} \end{bmatrix} = \begin{bmatrix} km_{11}&km_{12}&km_{13}\\ km_{21}&km_{22}&km_{23}\\ km_{31}&km_{32}&km_{33} \end{bmatrix}

矩阵与矩阵的乘法

运算方法

cij=ai1b1j+ai2b2j++aimbnj=k=1naikbkj c_{ij}=a_{i1}b_{1j}+a_{i2}b_{2j}+\cdots+a_{im}b_{nj}=\sum^n_{k=1}a_{ik}b_{kj}

运算性质

  • 不满足交换律
  • 满足结合律

转置矩阵(transposed matrix

运算方法

  • 沿对角线对称

运算性质

  • 矩阵转置的转置等于原矩阵

  • 矩阵串接的转置,等于反向串接各个矩阵的转置

    (AB)T=BTAT(AB)^T=B^TA^T

逆矩阵(inverse matrix

运算方法

  • 挺麻烦的

运算性质

  • 可逆,(M1)1=M(M^{-1})^{-1}=M
  • 单位矩阵的逆矩阵是本身,I1=II^{-1}=I

运算关系性质

  • (MT)1=(M1)T(M^T)^{-1}=(M^{-1})^T
  • (AB)1=B1A1(AB)^{-1}=B^{-1}A^{-1}(ABCD)1=D1C1B1A1(ABCD)^{-1}=D^{-1}C^{-1}B^{-1}A^{-1}

运算意义

  • 单位矩阵除以原矩阵,相当于倒数的样子

其应用——变换(transform

线性变换(linear transform

线性变换指可以保留矢量和标量乘的变换,可以用3X3矩阵表示

  • f(x)+f(y)=f(x+y)kf(x)=f(kx) f(x)+f(y)=f(x+y)\\ kf(x)=f(kx)

  • 举例

    • 缩放(scale
    • 旋转(rotation
    • 错切(shear
    • 镜像(mirroring,也称为”映像“,reflection
    • 正交投影(orthographic projection

平移变换

平移变换不是线性变换,不满足标量乘法也不满足矢量加法,不能用一个3x3矩阵表示

仿射变换(affine transform

仿射变换就是合并线性变换平移变换的变换类型,可以使用一个4x4的矩阵来表示

为此需要把矢量扩展到四维空间下,这就是齐次坐标空间homogeneous space

总结

常见的变换种类和他们的特性

变换名称是线性变换吗是仿射变换吗是可逆矩阵吗是正交矩阵吗
平移矩阵NYYN
绕坐标轴旋转的旋转矩阵YYYY
绕任意轴旋转的旋转矩阵YYYY
按坐标轴缩放的缩放矩阵YYYN
错切矩阵YYYN
镜像矩阵YYYY
正交投影矩阵YYNN
透视投影矩阵NNNN

齐次坐标(homogeneous space

齐次坐标是一个四维矢量(相对于三维空间而已,可以超过四维),可以把三维矢量转换成齐次坐标

运算类

三维矢量转换成齐次坐标

  • 对于一个点,把w分量设为1
  • 对方向矢量,把w分量设为
  • 这样定义运算的原因:当用一个4x4矩阵对一个点进行变换时,平移旋转缩放都会施加于该点,但对方向矢量进行的平移会被忽略

分解基础变换矩阵

  • 基础变换矩阵:纯平移、纯旋转、纯缩放的变换矩阵叫做基础变换矩阵
    • 这些矩阵有一些共同点,可以把一个继承变换矩阵分解成4个组成部分

      左上角3x3矩阵表示旋转和缩放,右上角表示平移,左下角是零矩阵,右下角是标量1

      [M3x3t3x101x31] \begin{bmatrix} M_{3x3}&t_{3x1}\\ 0_{1x3}&1 \end{bmatrix}

特殊矩阵

特殊矩阵

  • 方块矩阵(square matrix
  • 对角矩阵(diagonal matrix
    • 对角元素(diagonal elements
  • 单位矩阵(identity matrix
  • 正交矩阵(orthogonal matrix
    • 特点
      • 等价于MMT=MTM=IMM^T=M^TM=I
      • 等价于MT=M1M^T=M^{-1}
      • 矩阵每一行都是单位矢量,且每一行个矢量之间互相垂直。该结论对列同样适用**【计算量最少的验证方法】**
    • 举例
      • 标准正交基
    • 应用
      • 快速求逆矩阵并减少运算量

变换矩阵

平移矩阵

对点变换

[100tx010ty001tz0001][xyz1]=[x+txy+tyz+tz1] \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix} = \begin{bmatrix} x+t_x\\ y+t_y\\ z+t_z\\ 1 \end{bmatrix}

对矢量变换(无效)

[100tx010ty001tz0001][xyz0]=[xyz0] \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\0 \end{bmatrix} = \begin{bmatrix} x\\ y\\ z\\ 0 \end{bmatrix}

特点

  • 不是正交矩阵
  • 对点有效,对矢量无效
  • 逆矩阵是反向平移得到的矩阵

缩放矩阵

对点变换

[kx0000ky0000kz00001][xyz1]=[kxxkyykzz1] \begin{bmatrix} k_x&0&0&0\\ 0&k_y&0&0\\ 0&0&k_z&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix} = \begin{bmatrix} k_xx\\ k_yy\\ k_zz\\ 1 \end{bmatrix}

对矢量变换

[kx0000ky0000kz00001][xyz0]=[kxxkyykzz0] \begin{bmatrix} k_x&0&0&0\\ 0&k_y&0&0\\ 0&0&k_z&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\0 \end{bmatrix} = \begin{bmatrix} k_xx\\ k_yy\\ k_zz\\ 0 \end{bmatrix}

特点

  • 一般不是正交矩阵
  • 如果缩放系数kx=ky=kzk_x=k_y=k_z,我们把这样的缩放称为统一缩放uniform scale),否则称为非统一缩放nonuniform scale
  • 逆矩阵是使用原缩放系数的倒数来对点或方向矢量进行缩放

旋转矩阵

绕x轴旋转时

Rx(θ)P=[10000cosθsinθ00sinθcosθ00001][xyz1] R_x(\theta)P= \begin{bmatrix} 1&0&0&0\\ 0&\cos\theta&-\sin\theta&0\\ 0&\sin\theta&\cos\theta&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}

绕y轴旋转时

Ry(θ)P=[cosθ0sinθ00100sinθ0cosθ00001][xyz1] R_y(\theta)P= \begin{bmatrix} \cos\theta&0&\sin\theta&0\\ 0&1&0&0\\ -\sin\theta&0&\cos\theta&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}

绕z轴旋转时(也适用于二维情况)

Rz(θ)P=[cosθsinθ00sinθcosθ0000100001][xyz1] R_z(\theta)P= \begin{bmatrix} \cos\theta&-\sin\theta&0&0\\ \sin\theta&\cos\theta&0&0\\ 0&0&1&0\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} x\\y\\z\\1 \end{bmatrix}

特点

  • 是正交矩阵,且多个旋转矩阵之间的串联同样是正交的
  • 逆矩阵是旋转相反角度得到的变换矩阵

复合变换

顺序很重要

  • 一般先缩放再旋转再平移,以保证结果一样
  • 多个轴旋转时,在Unity中按zxy的顺序旋转,但注意呦两种坐标系可以选择
    • (1) 绕坐标系E连续进行旋转,应使用(MzMxMy)P(M_zM_xM_y)P的顺序
    • (2) 每次旋转将坐标系一起旋转,应使用MyMxMZPM_yM_xM_ZP的顺序
    • 两种坐标系使用不同的旋转顺序后,结果是一样的。而Unity文档中说明的旋转顺序是第一种情况的顺序

坐标空间的变换矩阵

一些变量

  • 子坐标空间的一点:Ac=(a,b,c)A_c=(a,b,c)
  • 坐标空间C的3个坐标轴在父坐标空间P下的表示xcyczcx_c、y_c、z_c和原点位置OcO_c

父坐标空间与子坐标空间,一般有两个需求(方向矢量变换时则不需要扩展到齐次坐标空间,用3x3矩阵即可)

  • (1) 将子坐标空间下的点或矢量AcA_c转换到父坐标空间下的表示ApA_p,即

    Ap=McpAc A_p=M_{c\rightarrow p}A_c

    其中McpM_{c\rightarrow p}表示的是从子坐标空间变换到父坐标空间的变换矩阵

    Mcp=[xcyczc]=非矢量时 M_{c\rightarrow p}= \begin{bmatrix} |&|&|\\ x_c&y_c&z_c\\ |&|&|\\ \end{bmatrix} \xlongequal{非矢量时}

    |&|&|&|\ x_c&y_c&z_c&O_c\ |&|&|&|\ 0&0&0&1 \end

    Ac=MpcAp A_c=M_{p\rightarrow c}A_p

    其中MpcM_{p\rightarrow c}表示的是从父坐标空间变换到子坐标空间的变换矩阵

    Mpc=[xpypzp]=[xcyczc] M_{p\rightarrow c} =\begin{bmatrix} |&|&|\\ x_p&y_p&z_p\\ |&|&| \end{bmatrix} =\begin{bmatrix} -&x_c&-\\ -&y_c&-\\ -&z_c&- \end{bmatrix}

推导过程

Ap=Oc+axc+byc+czc=[OC]+[xcyczc][abc]=[xcyczcOc0001][abc1] \begin{aligned} A_p&=\bold O_c+a\bold x_c+b\bold y_c+c\bold z_c\\ &= \begin{bmatrix} |\\\bold O_C\\| \end{bmatrix} +\begin{bmatrix} |&|&|\\ \bold x_c&\bold y_c&\bold z_c\\ |&|&| \end{bmatrix} \begin{bmatrix} a\\b\\c \end{bmatrix}\\ &= \begin{bmatrix} |&|&|&|\\ x_c&y_c&z_c&O_c\\ |&|&|&|\\ 0&0&0&1 \end{bmatrix} \begin{bmatrix} a\\b\\c\\1 \end{bmatrix} \end{aligned}

技巧:怎么判断横着放还是竖着放?可以猜,然后用MABM_{A\rightarrow B}来变换xBx_B,看结果是否为(1,0,0)(1,0,0)

MABxB=[xcyczc]xB=[xBxByBxBzBxB]=[100] M_{A\rightarrow B}x_B= \begin{bmatrix} -&x_c&-\\ -&y_c&-\\ -&z_c&- \end{bmatrix} x_B= \begin{bmatrix} x_Bx_B\\ y_Bx_B\\ z_Bx_B \end{bmatrix} = \begin{bmatrix} 1\\ 0\\ 0 \end{bmatrix}

其他

矩阵和矢量

可以用矩阵来表示矢量,列矩阵或行矩阵都行

但当他与另一个矩阵相乘时需要注意选择次序和行列矩阵

(题外话:Unity中,一般把矢量放在矩阵的右侧,即把矢量转换成列矩阵来进行运算,使用的矩阵乘法是右乘)