《计算机图形学基础》之线性代数
第五章 线性代数
前言
到数学部分就深刻的感受到自己的菜 QAQ,不过没关系,这也说明了这篇文就很适合跟我一样的菜看。
![](https://img.haomeiwen.com/i17546328/195f385521c2c7ad.png)
每一行都在上演小剧场
- 咦,这是为啥?
- 哇。好神奇呀~
- 哎,这又是啥?
- 哇。好神奇哎~
5.1 行列式
比如向量 ,向量
,那么行列式
。
二维的行列式就是 面积,如下图, 就是图中平行四边形的面积。
![](https://img.haomeiwen.com/i17546328/9df17ead7dbd63b6.png)
三维的行列式就是 体积,如下图,
![](https://img.haomeiwen.com/i17546328/09152b03dfe863a5.png)
缩放 其中一个向量会 等比例 改变整个行列式代表的面积的大小,如图所示:
![](https://img.haomeiwen.com/i17546328/2d462ab077bcdae3.png)
于是有下面的公式:
错切 一个向量不会改变面积,因为底和高没变呀~ 如下图所示:
![](https://img.haomeiwen.com/i17546328/3a29b557b4ab3f4d.png)
所以有如下公式:
行列式满足 “分配律”,如下图所示,左边粗线所围成的区域面积是和右边粗线所围成的区域面积是一样的。
![](https://img.haomeiwen.com/i17546328/85516ef7c172e56d.png)
所以有如下公式:
向量也可以用 笛卡尔坐标系 来表示,比如 可以表示为
,有如下运算:
二维:
三维:
(MarkDown 写公式好累呀)
5.2 矩阵
矩阵可以不是方的,行列式必须是方的。但这里的矩阵我们依然只讨论方的。
矩阵 数乘:
矩阵 相加:
矩阵 相乘:
![](https://img.haomeiwen.com/i17546328/9af7dacc6a7c4e84.png)
![](https://img.haomeiwen.com/i17546328/89a26efca35462ff.png)
矩阵 交换律:
![](https://img.haomeiwen.com/i17546328/9b18117a96e7323a.png)
矩阵 等号两边同除:
也就是说即使 ,
也不一定等于
。
矩阵 结合律:
矩阵 分配律:
矩阵的 逆:
逆这个字的理解可以想象 ,这里的
在矩阵中是单位向量而已,一般用
来表示:
![](https://img.haomeiwen.com/i17546328/a462a5c8a275f587.png)
有以下公式:
矩阵的 转置:
不管是不是方的矩阵,都是在心里补全成方的,然后按对角线对称一下就好了:
![](https://img.haomeiwen.com/i17546328/ca78f04857e80b66.png)
转置有以下性质:
矩阵和行列式 有以下的性质:
![](https://img.haomeiwen.com/i17546328/19424077124456e8.png)
矩阵和 向量:
我们可以通过一个向量和矩阵相乘来以一定规则改变这个向量,比如将点 逆时针旋转 90°,那么也可以写成如下的形式,这里的
其实是
,具体怎么来的暂时不需要知道,后面会学到。
![](https://img.haomeiwen.com/i17546328/0a893cf80edb0167.png)
向量写在矩阵后面是目前的标准形式,也有老的书上是向量写在矩阵前面的,那需要将矩阵进行转置,如下所示:
![](https://img.haomeiwen.com/i17546328/0a6b74b8df45e737.png)
使用矩阵表示向量 点乘(内积):
![](https://img.haomeiwen.com/i17546328/89dd35d8a0ffe902.png)
![](https://img.haomeiwen.com/i17546328/3961e8965514d369.png)
使用矩阵表示向量 叉乘(外积):
![](https://img.haomeiwen.com/i17546328/47dc243b51cba98e.png)
对 矩阵乘向量 的理解:
首先,把概念具象化,假设有一个 ,展开来是这样的:
然后可以从两个角度来思考,把这个 的矩阵分成三行:
也就是每一行都对 做了内积。
把这个 的矩阵分成三列:
对角矩阵:所有非零元素都出现在对角线上的矩阵
对称矩阵:满足
(注意,对角矩阵一定是对称矩阵,但对称矩阵不一定是对角矩阵,比如说 。)
正交矩阵:每一行都当成一个向量,模都为 1,并且向量之间两两正交;对于每一列也是一样;并且正交矩阵的行列式值为 1 或者 -1;正交矩阵的逆矩阵就是他们的转置,有 ,这很容易理解,因为在非对角线上都是正交的向量的内积,而在对角线上则是向量自身内积,也就是向量取模。
(注意:正交矩阵跟对角矩阵和对称矩阵没关系... 是正交矩阵不能说明他们就是对角或者对称的)
单位向量 既是对角矩阵,又是对称矩阵,还是正交矩阵。
5.3 矩阵与行列式的计算
行列式的 转置 与本身相同,可以从面积上理解:
![](https://img.haomeiwen.com/i17546328/d1f5b9fe88f6cb6d.png)
![](https://img.haomeiwen.com/i17546328/36d3373509f47680.png)
![](https://img.haomeiwen.com/i17546328/c5cbaff959af37da.png)
理解行列式的 几何意义 是很有意思的,比如下面的行列式是代表了经过 的平面。很好理解,因为他代表了以
为边所围成的立方体的体积,但体积为零,所以三向量共面。
![](https://img.haomeiwen.com/i17546328/93c992e1340b0489.png)
拉普拉斯展开 计算行列式:
先求余因子,比如下面的 行列式,
位置上的 余因子,就是
,也就是把自身所在行和列 去掉 之后组成一个新的行列式。因为
的下标和为
,是偶数,所以余因子的符号是正的,如果下标和是奇数,则余因子的下标和是负的。加了正负号的余因子也叫作 代数余因子,写作
![](https://img.haomeiwen.com/i17546328/dfc9e82605f28d18.png)
![](https://img.haomeiwen.com/i17546328/2d4e817251af4b0e.png)
求出代数余因子之后,可以用任意一行或者任意一列进行展开,上面例子假设是使用的第二列展开,那么结果为:
![](https://img.haomeiwen.com/i17546328/62ecdccb59be587c.png)
再看一个带数字的,维度少一点的例子 ~ 是以第一行展开的。
![](https://img.haomeiwen.com/i17546328/91b348ed20f1009c.png)
因为行列式结果为 0,所以我们可以判断由每一行(或者每一列,因为行列式与其转置相同)为向量构成的立方体体积为 0。这也就等于说每一行(或者每一列)向量都不是线性独立的,也就是存在一个向量可以由其他向量线性表示。在这里就是
矩阵的 逆 的计算,公式为:
![](https://img.haomeiwen.com/i17546328/be878aa8c9c99c03.png)
其中
其实很好理解(书上说的,我拿来装逼一下... ),对于在
![](https://img.haomeiwen.com/i17546328/b1e5a006c3998c49.png)
对于不在对角线上的运算,假设用
![](https://img.haomeiwen.com/i17546328/041323098cba4668.png)
展开来的计算如下:
![](https://img.haomeiwen.com/i17546328/e00aa5db84998e32.png)
这个为什么就等于零呢?我们构建另外一个矩阵
![](https://img.haomeiwen.com/i17546328/5e2e54ac2a97b151.png)
现在假设以 第一行 进行拉普拉斯展开求矩阵
![](https://img.haomeiwen.com/i17546328/e00aa5db84998e32.png)
很神奇,这个式子跟上面的是一样的,而矩阵
再看一个带数字的例子验证巩固一下 ~
![](https://img.haomeiwen.com/i17546328/c63800df3177d7b5.png)
这种求逆矩阵的运算适用于任何矩阵,不只是 的,这里只是为了方便排版;并且这种方式对于大型矩阵来说效率并不高,但在图形学中一般都是小矩阵,所以并没有多大影响。
用矩阵来表示和计算 线性方程(一次方程),下面是一个常见的线性方程组:
![](https://img.haomeiwen.com/i17546328/9e548ac60d2ce9f6.png)
我们可以用矩阵来表示:
![](https://img.haomeiwen.com/i17546328/429e124aabfd1194.png)
还可以用更简单的写法 ,其中
是所有已知的常数组合,也就是上面
的矩阵,
是所有未知数的列矩阵,也就是上面的
,
是已知的常数列矩阵,也就是上面的
。
虽然有很多种解法,但是因为图形学中的矩阵维度都 ,所以只介绍一种,叫做 克莱姆法则(Cramer's Rule),上述方程的解法是:
![](https://img.haomeiwen.com/i17546328/6b16c690cd8727cc.png)
规则就是,分母是
5.4 特征值与矩阵对角化
矩阵 的特征向量
和特征值
(lambda) 满足
,这也就意味着经过了
的变换(有可能是旋转,缩放等),向量
的方向不变。我们先假设
存在特征向量和特征值,那么有如下过程:
因为我们假设特征向量存在,所以 ,所以有
,为了方便表述,我们假定
是
的,那么有如下式子:
![](https://img.haomeiwen.com/i17546328/5ffb7ef42a0e559a.png)
带数字的练习来验证一下理解是否出现偏差:
![](https://img.haomeiwen.com/i17546328/1eb953e54a6b1c4f.png)
求出了两个特征值 ,然后分别带回原来的式子求对应的特征向量,结果为
(注意这里的是非平凡解,不是
),可以看到确实是正交的,并且对于每一个特征向量,其实都是无数个平行的向量,这里只是取了单位向量而已。
![](https://img.haomeiwen.com/i17546328/9bbc6298222e41ad.png)
最后写成 的形式:
![](https://img.haomeiwen.com/i17546328/5e992054a59b89f3.png)
上面的特征值分解只针对对称矩阵,对于非对称矩阵,特征值分解不太好搞(?),而且即使 全是实数的,也可能会出现复数的特征值和特征向量。所以针对非对称矩阵(甚至 不是 方的矩阵),我们一般使用 奇异值分解(singular value decomposition (SVD)) ,
将会被分解成
,这与特征值分解的区别在于左边和右边的正交矩阵不再是同一个。
和
可能是不同的正交矩阵,
的列是
的左奇异向量,
的列是
的右奇异向量,
的对角线是
的奇异值。当
是对称矩阵,并且所有特征值都是非负的时候,那么奇异值分解跟特征值分解没有什么不同。首先我们定义
(注意我们要求的还是
,
只是我们构造出来的对称矩阵,并且这样构造出来的矩阵一定是对称的,因为
),并假设我们可以对矩阵
进行 SVD:
![](https://img.haomeiwen.com/i17546328/84da3c69921b6953.png)
以上式子是基于三条定理(上面都提过的):
-
,
是正交矩阵
-
,
是对角矩阵
看到 的形式,有木有恍然大悟~ 这其实就是
的特征值分解,
相当于上面的
,
相当于上面的
。所以我们发现 矩阵的奇异值就是它和自身转置的乘积的特征值的平方根,左奇异向量就是它和自身转置的乘积 (
) 的特征向量,右奇异向量就是自身转置和自身乘积 (
)的特征向量。
做个题巩固一下:
![](https://img.haomeiwen.com/i17546328/8992eff8ad103df0.png)
是上一节的矩阵,我们知道它的特征值为
,特征向量为
。所以
,所以
。又因为
,所以将
带入得:
![](https://img.haomeiwen.com/i17546328/db6d36ed9103f298.png)
将稍微变换一下形式成:
![](https://img.haomeiwen.com/i17546328/a5596ff69fad6d92.png)
![](https://img.haomeiwen.com/i17546328/031dedbfe4514080.png)
常见问题解答(FAQ)
-
为什么矩阵乘法要定义成这个亚子,不能对应元素相乘嘛?
答:为了良好的计算属性,为了方便(我 瞎翻译 的,不过大概就是这个意思,感兴趣可以去看原文) -
有时特征值和奇异值是一回事,有时一个是另一个的平方。哪个是对的?
答:对于 实数对称矩阵,并且它的特征值不是负数,那么它的特征值和奇异值就是一样的。如果不是对称的,就构建
,
是对称的并且有非负的特征值,并且
和
的特征值是一样的,为
的特征值(奇异值)的平方根。
作业中的定理
- 如果矩阵的列是正交的,那么行也是正交的
- 对角矩阵的奇异值使其对角元素
- 对于三个 3D 向量
,存在
-
组成的空间 四面体 的体积是