US2S1L3——特殊矩阵
特殊矩阵
-
方块矩阵 —— 行列数相等的矩阵
-
对角矩阵 —— 只有主对角线有值,其余元素全为零的 方阵
-
单位矩阵 —— 主对角线上的元素均为1 的 对角矩阵
-
数量矩阵 —— 主对角线上的元素为同一值 的 对角矩阵
-
转置矩阵 —— 将原始矩阵的行和列互换得到的 新矩阵
- 矩阵转置的转置等于原矩阵 (MT)T=M
- 矩阵串接的转置,等于反向串接各个矩阵的转置 (AB)T=BTAT
-
逆矩阵 —— MM−1=M−1M=I(单位矩阵)
-
正交矩阵 —— 一个方阵和它的转置矩阵相乘为单位矩阵,那么它就是正交矩阵:MMT=MTM=I
-
列矩阵和行矩阵 —— 列矩阵就是只有一列的矩阵;行矩阵就是只有一行的矩阵。他们一般用于表示向量
方块矩阵
方块矩阵简称方阵,它的特点是**行列数相等**,比如 3×3、4×4,n×n 的矩阵都可以称为方阵
[2751]1672583494030572170528542
对角矩阵
对角矩阵是一种特殊的方阵,它是 只有主对角线有值,其余元素全为零 的 方阵
[2001]1000500094000070000500002
注意:矩阵中的主对角线就是指 从左上角到右下角的对角线
单位矩阵
单位矩阵是一种特殊的对角矩阵 它是 主对角线上的元素均为1 的 对角矩阵
[1001]1000100011000010000100001
注意:任何矩阵(M)和单位矩阵(I)相乘的结果都是原来的矩阵(前提是满足相乘的规则)
MI=IM=M
[2431]×[1001]=[1001]×[2431]=[2431]
数量矩阵
数量矩阵是一种特殊的对角矩阵,它是 主对角线上的元素为同一值 的 对角矩阵
[7007]9.50009.50009.57000070000700007
数量矩阵和单位矩阵的关系:假设 I 是单位矩阵,k是任何数,则 kI 称为数量矩阵
转置矩阵
转置矩阵是将 原始矩阵的行和列 互换得到的新矩阵,假设矩阵为 M ,那 M 的转置矩阵一般写为 MT
[56609172]T=56976012159268T=[125698]
[xyz]T=xyzxyzT=[xyz]
转置矩阵对于我们来说有一些常用的性质
-
矩阵转置的转置等于原矩阵
(MT)T=M
-
矩阵串接的转置,等于反向串接各个矩阵的转置
(AB)T=BT×AT
逆矩阵
逆矩阵是所有特殊矩阵当中计算最复杂的矩阵
它的特点是 逆矩阵是必须是一个方阵,并且不是所有矩阵都有逆矩阵
假设 一个方阵 M , 它的逆矩阵用 M−1 表示
那么 MM−1=M−1M=I(单位矩阵)
如果一个矩阵存在对应的逆矩阵,我们就说该矩阵是可逆的(或称非奇异的)
如果不存在,那么该矩阵为不可逆的(或称奇异的)
逆矩阵的计算
- 确定矩阵为方阵(即行列数相等)
- 计算矩阵的行列式(若行列式值为0,则该矩阵没有逆矩阵,也就是矩阵不可逆)
- 计算矩阵的代数余子式矩阵
- 计算标准伴随矩阵(转置代数余子式矩阵)
- 计算逆矩阵(标准伴随矩阵 / 行列式)
行列式的计算方式
假设矩阵为 M,∣M∣ 表示 M 矩阵的行列式,行列式是一个标量(数值)
计算口诀:
左下左上画对角,线上数值都相乘,
数值数量为行列,数量不够对岸取,
左下分组加,左上分组减
-
2×2 矩阵的行列式计算方式:
=[m11m21m12m22]+m11×m22−+m21×m12
或者这样记:
-
3×3 矩阵的行列式计算方式:
=m11m21m31m12m22m32m13m23m33+m11×m22×m33+m21×m32×m13+m31×m12×m23−m31×m22×m13−m32×m23×m11−m33×m21×m12
或者这样记:
示例:
===[4−332]4×2−3×(−3)8−(−9)17
===133−22−2310+1×2×0+3×(−2)×3+3×(−2)×(−1)−3×2×3−3×(−2)×0−1×(−2)×(−1)0+(−18)+6−18−0−2−32
代数余子式矩阵的计算方式
假设 矩阵 M 的 代数余子式矩阵为 矩阵 C
M=m11m21m31m12m22m32m13m23m33
C=c11c21c31c12c22c32c13c23c33
标量的代数余子式计算规则:Cij=−1的i+j次幂×去掉第i行,j列组成的矩阵的行列式
C11=−11+1×[m22m32m23m33]=−12×(m22⋅m33−m32⋅m23)
C12=−11+2×[m21m31m23m33]=−13×(m21⋅m33−m31⋅m23)
举例:
113−22−23−10,其代数余子式矩阵C=−2−6−4−3−910−12−48
标准伴随矩阵的计算方式
标准伴随矩阵 为原矩阵的 代数余子式矩阵 的转置矩阵
假设 矩阵 M 的 代数余子式矩阵为 矩阵 C
M=m11m21m31m12m22m32m13m23m33
C=c11c21c31c12c22c32c13c23c33
那么矩阵 M 的标准伴随矩阵为
CT=c11c12c13c21c22c23c31c32c33
举例:
113−22−23−10,其代数余子式矩阵C=−2−6−4−3−910−12−48
因此,它的标准伴随矩阵为CT:
CT=−2−3−12−6−9−4−4108
计算逆矩阵
逆矩阵 为 标准伴随矩阵 / 行列式
标准伴随矩阵为
113−22−23−10,其代数余子式矩阵C=−2−6−4−3−910−12−48,其标准伴随矩阵为CT=−2−3−12−6−9−4−4108
行列式为
===133−22−2310+1×2×0+3×(−2)×3+3×(−2)×(−1)−3×2×3−3×(−2)×0−1×(−2)×(−1)0+(−18)+6−18−0−2−32
因此,它的逆矩阵为
M−1=−32CT=−32−2−32−3−32−12−32−6−32−9−32−4−32−4−3210−328=161323831633298181−165−41
逆矩阵的重要性质
-
逆矩阵的逆矩阵是原矩阵本身 (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 为一个矢量(向量))
或者说,当一个矢量v被一个矩阵M变换(平移、旋转、缩放)时(Mv),再左乘一个M−1即可将这个矢量v变换回来
M−1(Mv)=(M−1M)v=Iv=v
正交矩阵
前置知识:逆矩阵,向量点乘,向量模长和单位向量
正交矩阵是一种特殊的方阵,正交的意思是垂直
它的特点是:一个方阵和它的转置矩阵相乘为单位矩阵,那么它就是正交矩阵:MMT=MTM=I
通过正交矩阵的这一性质,再根据上节课学习的逆矩阵的一个重要性质:MM−1=M−1M=I
我们可以推导出:如果一个矩阵是正交的,那么它的逆矩阵等于其转置矩阵:MT=M−1
如果一个矩阵是正交矩阵,那么它的转置矩阵也是正交矩阵
向量之间点乘的计算公式:
向量A(Xa,Ya,Za),向量B(Xb,Yb,Zb)
A⋅B=Xa×Xb+Ya×Yb+Za×Zb
点乘结果 = 0 两个向量夹角为直角
与向量模长和单位向量知识延伸出:如果向量和自己的点乘结果为1,则该向量为单位向量:A⋅A=x2+y2+z2=1
M=−−−IIIIII−−−,MT=∣I∣∣II∣∣III∣(这里的I,II,III不是矩阵内的元素,而是代表某一行(列),可以视为一个行(列)向量)MMT=−−−IIIIII−−−∣I∣∣II∣∣III∣=I⋅III⋅IIII⋅II⋅IIII⋅IIIII⋅III⋅IIIII⋅IIIIII⋅III∵M是正交矩阵∴MMT=MTM=I∴MMT=I⋅III⋅IIII⋅II⋅IIII⋅IIIII⋅III⋅IIIII⋅IIIIII⋅III=100010001∴{I⋅I=II⋅II=III⋅III=1I⋅II=II⋅I=I⋅III=III⋅I=II⋅III=III⋅II=0
根据以上内容,可以得到结论:
- 正交矩阵的每一行,都是单位向量(自己点乘自己结果为1)
- 正交矩阵的每一行,都彼此互相垂直(彼此点乘结果为0)
- 以上结论对正交矩阵的每一列也适用,因为正交矩阵的转置也是正交矩阵
如何判断正交矩阵
根据正交矩阵的基本概念,我们可以总结出判断一个矩阵是否是正交矩阵的方式有:
-
判断MMT=MTM=I,满足则为正交矩阵
-
判断矩阵的每一行(列)是否是 单位向量
n 维向量 v=(v1,v2,...,vn), 向量模长:∣v∣=v12+v22+...+vn2=1
同时,判断矩阵的行(列)向量是否彼此正交(垂直):v⋅u=0
满足则为正交矩阵
正交矩阵的重要性质
如果矩阵 M 为正交矩阵
- MT 也为正交矩阵
- MT=M−1
- 正交矩阵的行列式为 1 或 -1
- 正交矩阵的 各行都是单位向量且彼此正交(垂直)
- 正交矩阵的 各列都是单位向量且彼此正交(垂直)
列矩阵和行矩阵
-
列矩阵和行矩阵的基本概念
列矩阵就是只有一列的矩阵;行矩阵就是只有一行的矩阵。他们一般用于表示向量
把向量作为列矩阵和行矩阵与矩阵进行乘法运算时,计算顺序(列在后,行在前)和结果是不同的
-
列矩阵和行矩阵在Unity中的使用规则
在Unity的Shader开发中,我们采用列矩阵的形式进行向量计算,利用结合律,我们可以从右往左阅读
CBAv=C(B(Av))
如果想要使用行矩阵计算出和列矩阵相同的结果,我们可以乘以变换矩阵的转置矩阵
vATBTCT=(vAT)BT)CT
在Unity Shader开发中我们经常会对向量进行矩阵运算,
而在Unity的三维坐标系中向量一般都是三维向量(x,y,z),
由于要进行矩阵计算,我们就需要把向量用矩阵表示。
通过我们之前对矩阵的学习,三维向量的矩阵表示,可以有两种:
-
列矩阵:只有一列的矩阵
xyz
-
行矩阵:只有一行的矩阵
[xyz]
在进行向量的矩阵运算时,把它作为列矩阵和行矩阵得到的运算结果是不同的
假设一个矩阵:
M=m11m21m31m12m22m32m13m23m33
一个向量以列或行矩阵的形式和它进行计算时,它们的计算顺序会有不同,结果也会有不同
-
列矩阵:为了能和 3×3 矩阵进行乘法运算,列矩阵必须放在右侧才能进行计算
m11m21m31m12m22m32m13m23m33xyz=m11x+m12y+m13zm21x+m22y+m23zm31x+m32y+m33z
-
行矩阵:为了能和 3×3 矩阵进行乘法运算,行矩阵必须放在左侧才能进行计算
[xyz]m11m21m31m12m22m32m13m23m33=[m11x+m21y+m31zm12x+m22y+m32zm13x+m23y+m33z]
注意:两种计算方式结果虽然都是3个元素组成的列矩阵和行矩阵,但是结果是不同的
列矩阵和行矩阵在Unity中的使用规则
在标准的线性代数中,矩阵和向量的乘法是按列进行的。
在 Unity 的 Shader开发中,为了和标准的数学和线性代数概念保持一致,
更加便于理解和应用,它也遵循这种矩阵乘法的定义,也就是:
将向量表示为列矩阵进行计算
m11m21m31m12m22m32m13m23m33xyz=m11x+m12y+m13zm21x+m22y+m23zm31x+m32y+m33z
使用列矩阵的结果是,我们的阅读顺序是从右到左的,
假设向量为列矩阵 v,A、B、C 分别为3个变换矩阵 CBAv=C(B(Av)) (矩阵乘法满足结合律)
即先对 向量 v 使用 A 进行变换,再依次使用 B、C 进行变换
注意:如果想把向量作为行矩阵处理,也是可以的,为了让行矩阵计算结果和列矩阵相同,我们可以采用以下规则
- 列矩阵: CBAv=C(B(Av))
- 等价于行矩阵:vATBTCT=(vAT)BT)CT
行矩阵必须乘以变换矩阵的转置矩阵才能保证计算结果和列矩阵结果一致