矩阵
矩阵是什么?
矩阵是一种用来表示和处理数据的数学工具
它可以帮助我们有效的管理和计算大量的数据
矩阵的数学表示
可以通过 方括号内的数值表格来表示
$$ \begin{bmatrix} {4}&{6}&{1} \end{bmatrix} \begin{bmatrix} {4}\\ {6}\\ {1}\\ \end{bmatrix} \begin{bmatrix} {1}&{3}&{2}\\ {5}&{6}&{7}\\ \end{bmatrix} \begin{bmatrix} {1}&{3}&{2}\\ {5}&{6}&{7}\\ {5}&{6}&{7}\\ \end{bmatrix} $$矩阵是由m ×n(m和n大于0)个标量组成的,可以通过方块好内的数值表格来表示
矩阵的表示
$$ Matrix= \begin{pmatrix} {m_{11}}&{\cdots}&{m_{1n}}\\ {\vdots}&{\ddots}&{\vdots}\\ {m_{m1}}&{\cdots}&{m_{mn}}\\ \end{pmatrix} $$在程序中,我们用于存储矩阵结构的容器类型有很多选择,最常见的的为:
- 数组(一维二维都可以)
- 嵌套列表(两个List嵌套)
- 开发工具提供的类或结构体(Unity中的Matrix4x4、Matrix3x2结构体)
矩阵的乘法
$$ 2× \begin{bmatrix} 1&2&3\\ 1&2&3 \end{bmatrix} {=} \begin{bmatrix} 2&4&6\\ 2&4&6 \end{bmatrix} $$相乘规则:
让矩阵中的每一个标量和标量相乘即可
矩阵和矩阵相乘的条件
$$ A= \begin{matrix} {\color{Red}a_{11}}&{\color{Red}a_{12}}&{\color{Red}a_{13}}\\ {\color{green}a_{21}}&{\color{green}a_{22}}&{\color{green}a_{23}}& \end{matrix} B= \begin{matrix} {\color{green}b_{11}}&{\color{Red}b_{12}}\\ {\color{green}b_{21}}&{\color{Red}b_{22}}\\ {\color{green}b_{31}}&{\color{Red}b_{32}} \end{matrix} \\AB=C= \begin{matrix} {c_{11}}&{\color{blue}c_{12}}\\ {c_{21}}&{c_{22}} \end{matrix} \\{\color{blue}C12}=\color{Red}{a_{11}}×{b_{12}}+{a_{12}}×{b_{22}}+{a_{13}}×{b_{32}} $$相乘规则:
左行乘右列再相加
矩阵和矩阵的乘法 不满足交换律 满足结合律
特殊矩阵
方块矩阵 行列数相等的矩阵
对角矩阵 只有主对角线有值,其余元素全部为0的 方阵
单位矩阵 主对角线上的元素均为1的 对角矩阵
数量矩阵 主对角线上的元素为同一值的 对角矩阵
转置矩阵 将原始矩阵的行和列互换得到的新矩阵 转置矩阵的转置等于原矩阵(MT)T=M 矩阵串接的转置 等于反向串接各个矩阵的转置(AB)T=BTAT
特殊矩阵-逆矩阵
逆矩阵是所有特殊矩阵中计算最复杂的矩阵
特点:
逆矩阵必须是一个方阵
不是所有矩阵都有逆矩阵
一个矩阵乘他的逆矩阵(如果有) 结果为单位矩阵 假设一个方阵M,它的逆矩阵用M-1表示 那么MM-1 = M-1M = 1(单位矩阵)
如果一个矩阵存在逆矩阵,我们就说该矩阵是可逆的(或称非奇异的)
如果不存在,那么该矩阵为不可逆的(或称奇异的)
计算矩阵的逆矩阵
- 确定矩阵为方阵(行列数相等)
- 计算矩阵的行列式(若行列式值为0,则该矩阵没有逆矩阵)
- 计算矩阵的代数余子式矩阵
- 计算标准伴随矩阵(转置余子式矩阵)
- 计算逆矩阵(标准伴随矩阵/行列式)
计算行列式
假设矩阵为M,|M|表示M矩阵的行列式,行列式是一个标量(数值)
计算口诀:
- 左下左上画对角 线上数值都相乘
- 数值数量为行列,数量不够对岸取
- 左下分组加,左上分组减
代数余子式
$$ M=\begin{bmatrix} {m_{11}}&{m_{12}}&{m_{13}}\\ {m_{21}}&{m_{22}}&{m_{23}}\\ {m_{31}}&{m_{32}}&{m_{33}} \end{bmatrix} C= \begin{bmatrix} {\color{blue}c_{11}}&{\color{Brown}c_{12}}&{c_{13}}\\ {c_{21}}&{c_{22}}&{c_{23}}\\ {c_{31}}&{c_{32}}&{c_{33}} \end{bmatrix} $$标量的代数余子式计算规则:
Cij=-1的i+j次幂 * 去掉第i行,j列组成的矩阵的行列式
$$ M = \begin{bmatrix} {m_{\color{green}11}}&{m_{12}}&{m_{13}} \\ {m_{21}}&{\color{Red}m_{22}}&{\color{Red}m_{23}}\\ {m_{31}}&{\color{Red}m_{32}}&{\color{Red}m_{33}} \end{bmatrix} \\{\color{blue}C_{11}}=-1{\color{green}^{(1+1)}}×{\color{Red}(m_{22}*m_{33}-m_{32}-m_{23})} $$$$ M = \begin{bmatrix} {m_{11}}&{m_{\color{green}12}}&{m_{13}} \\ {\color{Red}m_{21}}&{m_{22}}&{\color{Red}m_{23}}\\ {\color{Red}m_{31}}&{m_{32}}&{\color{Red}m_{33}} \end{bmatrix} \\{\color{Brown}C_{12}}=-1{\color{green}^{(1+2)}}*{\color{Red}(m_{21}*m_{33}-m_{31}*m_{23})} $$逆矩阵的重要性质
逆矩阵的逆矩阵是原矩阵的本身 (M-1)-1=M
逆矩阵乘以自己的逆矩阵为单位矩阵 MM-1=M-1M=I
单位矩阵的逆矩阵是它本身 I-1=I
转置矩阵的逆矩阵是逆矩阵的转置 (MT)-1=(M-1)T
逆矩阵串接相乘后的逆矩阵 等于 反向串接各个矩阵的逆矩阵相乘 (AB)-1=B -1A -1 (ABCD)-1=D -1C -1B -1A -1
逆矩阵可以计算矩阵变换的反向变换(M为矩阵,V为一个矢量) M-1(MV) = <M-1M)v = lv = v
特殊矩阵-正交矩阵
正交矩阵是一种特殊的方阵,正交的意思就是垂直
他的特点是:
一个方阵和他的转值矩阵相乘为单位矩阵 那么他就是正交矩阵
MMT=MTM = I
如果一个矩阵是正交矩阵,那么它的转置矩阵也是正交矩阵
通过正交矩阵的性质 结合逆矩阵的性质(一个方阵和他的逆矩阵相乘为单位矩阵MM-1=M-1M=I)可以推导出
MT = M -1正交矩阵的逆矩阵 等于其转置矩阵
正交矩阵的性质
正交矩阵的每一行,都是单位向量(自己点乘自己结果为1)
推导:
向量(x,y,z)
单位向量 = (x/模长, y/模长, z/模长)
$$ \sqrt{x^2+y^2+z^2} $$计算模长 相当于自己点乘自己
推导出 如果自己点乘自己的结果为1,则模长为1,该向量为单位向量
正交矩阵的每一行,都彼此互相垂直(彼此点乘结果为0)
推导
向量A (Xa,Ya,Za)
向量B (Xb,Yb,Zb)
A·B = XaXb + YaYb + ZaZb
点乘数学性质:两个向量点乘结果为 0 ,说明两个向量之间垂直
特殊矩阵-行矩阵和列矩阵
Unity Shader开发中们经常会对向量进行矩阵运算
在Unity的三维坐标系中
向量一般都是三维向量(x,y,z)由于要进行矩阵计算就需要把向量用矩 阵表示
- 列矩阵:只有一列的矩阵
- 行矩阵:只有一行的矩阵
在进行向量的矩阵运算时,把它作为列矩阵和行矩阵得到的运算结果是不同
列矩阵和行矩阵的重要概念
$$ \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} {m_{11}*x+m_{12}*y+m_{13}*z}\\ {m_{21}*x+m_{22}*y+m_{33}*z}\\ {m_{31}*x+m_{22}*y+m_{33}*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} {x}&{y}&{z} \end{bmatrix} $$$$ ==\begin{bmatrix} {m_{11}*x+m_{21}*y+m_{31}*z}& {m_{12}*x+m_{22}*y+m_{32}*z}$ {m_{13}*x+m_{23}*y+m_{33}*z} \end{bmatrix} $$注意:两种计算方式结果虽然都是3个元素组成的列矩阵和行矩阵,但是结果是不同的
列矩阵和行矩阵在Unity中的使用规则
在标准的线性代数中,矩阵和向量的乘法是按列进行的。
在Unity 的 Shader开发中,为了和标准的数学和线性代数概念保持一致,更加便于理解和应用,它也遵循这种矩阵乘法的定义,也就是:
将向量表示为列矩阵进行计算
列矩阵和行矩阵在Unity中的使用规则
使用列矩阵的结果是,我们的阅读顺序是从右到左的
假设向量为列矩阵v,A、B、C分别为3个变换矩阵
CBAv = C(B(Av)) (矩阵乘法满足结合律)
即先对 向量v使用A进行变换,再依次使用B、C进行变换
注意:如果想把向量作为行矩阵处理,也是可以的
为了让行矩阵计算结果和列矩阵相同,我们可以采用以下规则
列矩阵: CBAv = C(B(Av)) 等价于
行矩阵:vATBTCT = ((vAT)BT)CT
行矩阵必须乘以变换矩阵的转置矩阵才能保证计算结果和列矩阵结果一致