图形学的数学基础(七):矩阵基础

760 阅读4分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

图形学的数学基础(七):矩阵基础

不幸的是,没有人能够告诉我们矩阵是什么。你必须亲自去看看。 -墨菲斯《黑客帝国》

矩阵在3D数学中具有重要意义,它们主要用于描述两个坐标空间之间的关系,通过矩阵和矢量相乘,可以将矢量从某一坐标空间转换到另一个坐标空间。通过矩阵和矩阵相乘,可以描述一系列的变换动作。

数学定义

在线性代数中,矩阵是排列成行和列的矩形数字网格。矩阵可以定义为数字的二维数组。因此矢量是标量的数组,而矩阵是矢量的数组。

矩阵维度和表示法

通过计算矩阵包含的行数和列数来定义矩阵的大小,对于具有r行和c列的矩阵,称为 r×cr \times c矩阵。 当希望引用矩阵中的各个元素时,将使用下标表示法。符号mijm_{ij}表示矩阵Mi行j列对应的元素。需要注意的是,矩阵其实索引为1.并不是0.

方阵(Square Matrice)

具有相同行数和列数的矩阵称为方形矩阵,方阵的对角元素是行和列索引相同的元素。例如 3×33\times3矩阵M的对角元素是m11,m22,m33m_{11},m_{22},m_{33}。 如果矩阵中所有的非对角元素都为零,则该矩阵为对角矩阵(Diagonal Matrix)。

单位矩阵

有一类特殊的对角矩阵叫单位矩阵(Identity Matrix)。其对角线上的值为1,其它元素均为0.单位矩阵记作I.单位矩阵有一个重要的性质,即它是矩阵的乘法单位元素。如果将矩阵乘以单位矩阵,则得到原始矩阵。单位矩阵对于矩阵的意义,相当于标量中的数字1.

作为矩阵的矢量

矩阵可以包含任何正数的行和列,包括一个,维数nn的矢量可以被视为1×n1\times n矩阵,或者被视为n×1n\times 1矩阵。1×n1\times n矩阵称为行矢量(RowVectorRow Vector),n×1n\times 1矩阵被称为列矢量(ColumnVectorColumn Vector

1×31\times 3矩阵 [xyz]\begin{bmatrix}x&y&z\end{bmatrix}

3×13\times 1矩阵 [xyz]\begin{bmatrix}x\\y\\z\end{bmatrix}

矩阵转置(Transpose)

给定r×cr\times c矩阵M的转置表示为MTM^T,是c×rc\times r矩阵,其中列由M的行构成,即 MijT=MjiM^T_{ij} = M_{ji}

[abcdefghi]T\begin{bmatrix}a&b&c\\d&e&f\\g&h&i\end{bmatrix}^T = [adgbehcfi]\begin{bmatrix}a&d&g\\b&e&h\\c&f&i\end{bmatrix}

对于矢量,转置会将行矢量转换为列矢量,反之亦然。

矩阵转置的性质

  • 对于任意矩阵转置的转置等于其自身:(MT)T=M(M^T)^T = M
  • 对于任意对角矩阵D,其转置等于自身:DT=DD^T = D

矩阵乘法

矩阵与标量相乘

矩阵M与标量k相乘,得到与M相同维度的矩阵。结果矩阵kMk\textbf{M}中的每个元素是kkM\textbf{M}中相应元素的乘积。

kM=k[m11m12m13m21m22m23m31m32m33]=[km11km12km13km21km22km23km31km32km33]k\textbf{M} = 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}

矩阵相乘

相较矩阵和标量乘法简单和宽松的定义,矩阵之间相乘是有一定条件的,只有满足特定条件的矩阵才可以相乘。具体规则如下:设矩阵Ar×m\textbf{A}为r \times m, 矩阵Bn×c\textbf{B}为 n \times c矩阵,只有当m==nm == n时,A×B\textbf{A} \times \textbf{B}才有意义。即第一个矩阵的列数等于第二个矩阵的行数,得到的结果为 Cr×c\textbf{C}为 r \times c矩阵。

1661676489593.jpg

C\textbf{C}中每个元素Cij\textbf{C}_{ij}等于A\textbf{A} 的第i行与 B\textbf{B}的第j列点乘的结果。

Cij=k=1naikbkj\textbf{C}_{ij} = \sum\limits_{k=1}^{n} a_{ik}b_{kj}

矩阵相乘性质

  • 任何矩阵和单位矩阵相乘等于自身:MI=IM=M\textbf{MI} = \textbf{IM} = \textbf{M}
  • 矩阵乘法是不可交换的:ABBA\textbf{AB} ≠ \textbf{BA}
  • 矩阵乘法是可结合的:ABC=A(BC)\textbf{ABC} = \textbf{A(BC)}
  • 两个矩阵乘积的转置两个矩阵分别转置以相反的顺序乘积:(AB)T(\textbf{AB})^T = BTAT\textbf{B}^T\textbf{A}^T

矢量矩阵相乘

由于矢量可以被认为具有一行(RowVectorRow Vector)或者一列(ColumnVectorColumn Vector)的矩阵,因此可以应用上一小节矩阵相乘的规则将矢量和矩阵相乘。

当矢量为行矢量(1×n1 \times n)时,可以与矩阵(n×mn \times m)相乘,结果为1×m1 \times m行矢量。行矢量与矩阵相乘时,矢量位于左侧,矩阵位于右侧。

[xyz][m11m12m13m21m22m23m31m32m33]=[xm11+ym21+zm31xm12+ym22+zm32xm13+ym23+zm33]\begin{bmatrix}x&y&z\end{bmatrix}\begin{bmatrix}m_{11}&m_{12}&m_{13}\\m_{21}&m_{22}&m_{23}\\m_{31}&m_{32}&m_{33}\end{bmatrix} = \begin{bmatrix}xm_{11} + ym_{21} + zm_{31}&xm_{12} + ym_{22} + zm_{32}&xm_{13} + ym_{23} + zm_{33}\end{bmatrix}

当矢量为列矢量(n×1n \times 1)时,可以与矩阵(m×nm \times n)相乘,结果为m×1m \times 1列矢量。列矢量与矩阵相乘时,矢量位于右侧,矩阵位于左侧。

[m11m12m13m21m22m23m31m32m33][xyz]=[xm11+ym12+zm13xm21+ym22+zm23xm31+ym32+zm33]\begin{bmatrix}m_{11}&m_{12}&m_{13}\\m_{21}&m_{22}&m_{23}\\m_{31}&m_{32}&m_{33}\end{bmatrix}\begin{bmatrix}x\\y\\z\end{bmatrix} = \begin{bmatrix}xm_{11} + ym_{12} + zm_{13}\\xm_{21} + ym_{22} + zm_{23}\\xm_{31} + ym_{32} + zm_{33}\end{bmatrix}

  1. 结果矢量中每个元素是原始矢量与矩阵中的单个行或者列的点积。
  2. 矩阵中的每个元素确定输入矢量中特定元素对输出矢量的元素有多大的“权重”。
  3. 乘法的结果是矩阵的行或列的线性组合。

行与列矢量

当对行矢量应用多个变换时,可以从左到右依次对矢量进行矩阵乘法。例如对矢量v\vec{v}应用变换A,B,C\textbf{A},\textbf{B},\textbf{C}时,表示为:vABC\vec{v}\textbf{ABC}. 同理如果对列矢量应用相同的变换。则相应的乘法被写为:CTBTATv\textbf{C}^T\textbf{B}^T\textbf{A}^T\vec{v}.

引用

《3D数学基础》图形和游戏开发(第二版)