LearnGL - 06.2 - Matrix - 矩阵03


LearnGL - 学习笔记目录

本人才疏学浅,如有什么错误,望不吝指出。

上些篇:

这一篇:了解 行列式(determinant)逆矩阵(inverse)伴随矩阵(adjugate、adjoint)余子式(cofactor、minor)代数余子式(algebraic cofactor、minor)


逆矩阵-inverse matrix

在计算机3D图形学中,在实现一些特殊功能的时候,特别是一些座标还原,或重构成其他座标时,都可能会用到逆矩阵。

一个变换矩阵可以将我们传入的向量(组)变换到此变换矩阵中的另一个座标系中,如果我们要撤销这些变换呢,那么就需要逆过来变换,这个逆变换的矩阵,就叫:逆矩阵。

我们都知道,标量乘以标量,如:1×n=n1 \times n = n,就是1乘以任意数,等于那个数的本身。

同样在矩阵中也有类型的,如:IM=MI\cdot M=MII是单位矩阵(左上角到右下角都是1,其余都是0的方阵)乘以任意矩阵都等于那个矩阵的本身。

1×n=n1 \times n = n,同是1nn=1\frac{1}{n}\cdot n=1,而这个1n\frac{1}{n}就是n的倒数。

同样的也有:M1M=MM1=IM^{-1}\cdot M=M \cdot M^{-1}=I,而这其中的M1M^{-1}就是MM的逆矩阵。

在求逆矩阵时,需要用到行列式的功能。


行列式-determinant

先来讲一下,determinant - 矩阵行列式(这里我觉得中文翻译的理解不好),为啥要一个“式”字结尾,感觉会误导很多人,可以参考这篇文章的讲解:行列式determinant到底是个啥?,其实 determinant 就是求一个矩阵的N个轴(N个列向量,N>0,范围:1,2,…,n)围起来的空间大小(一维)、面积(二维)、体积(三维)、无法描述的变换空间大小(大于三维),最终的值是一个标量,注意:行列式结果是一个标量,并不是什么式子、也不是向量。

所以可以理解,它就是表述一个变换的包围空间的大小。

变换:

  • 一维中,假设一个2,就是可以把某个东西可以变大2倍的变换数值,它的determinant就是2,长度。
  • 二维中,假设x(0.5,0)y(0,2)\overrightarrow x(0.5,0) \overrightarrow y(0,2),就是可以让一个存在于二维下的数值对象(a,b)可以让它在x(0.5,0)y(0,2)\overrightarrow x(0.5,0) \overrightarrow y(0,2) 的变换后的结果:[xy](ab)[0.5002](ab)=(0.5a2b)\begin{bmatrix} \overrightarrow x & \overrightarrow y\\ |&| \end{bmatrix} \cdot \left(\begin{matrix}a\\b\end{matrix}\right) \rightarrow \begin{bmatrix} 0.5 & 0 \\ 0 & 2 \end{bmatrix} \cdot \left(\begin{matrix}a\\b\end{matrix}\right) = \left(\begin{matrix}0.5\cdot a\\2\cdot b\end{matrix}\right),相当于把a缩小一倍,b放大一倍。它的determinant就是0.5*2=1面积。
  • 同理三维中的是体积。

但上面都是比较理想的变换矩阵,就是他们的每列向量之间都是垂直的(正交的)所以求他们围起来空间,直接向量它们的向量长度就可以了。

但是如果他们不是垂直的(正交的),这个时候就需要将每个轴之间x,y,z分量上有参差的量围成的空间给减去,才能得到最终的空间。
在这里插入图片描述

如上图,a(a1,a2),b(b1,b2)向量就是不互相垂直的,黄色就是a(a1,a2)与b(b1,b2)向量x,y分量上参差的分量围起来的面积,着黄色部分的面积就是整个长方形需要减去的面积,最终得到的面积就是a,b向量围起来的平行四边形的面积。

也可以从百度百科中的:矩阵行列式的公式:det(abcd)=adbcdet\left(\begin{matrix} a & b \\ c & d \end{matrix}\right) =ad-bc 来发现一些线索。

如果b,c为零呢?det(abcd)=adbcdet(a00d)=ad0=addet\left(\begin{matrix} a & \color{#ff0000}b \\ \color{#ff0000}c & d \end{matrix}\right) =ad-{\color{#ff0000}bc}\rightarrow det\left(\begin{matrix} a & \color{#ff0000}0 \\ \color{#ff0000}0 & d \end{matrix}\right) =ad-{\color{#ff0000}0}=ad,那就是向量(a,0)与向量(0,d)垂直了,前者平行于x轴,后者平行于y轴,这时面积就等于ad了,如下图
在这里插入图片描述在这里插入图片描述

所以 行列式就是求变换矩阵的轴包围的一个空间大小,只不过在这个二维空间单位是面积,三维就是体积了,一维就是长度。

假设有矩阵A:[abcd]\begin{bmatrix} a & b\\ c & d \end{bmatrix}

det(A),或是矩阵A的行列式 又或是记作A|A|,那么:det(A)=A=adbcdet(A)=|A|=ad-bc

那么矩阵A的逆矩阵,记作A1A^{-1},那么A1=1A[dbca]=1adbc[dbca]A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}

暂且我们不管这个矩阵[dbca]\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}是怎么来的,它看起来就像是a与d交换,b,c添加负数了。这个矩阵叫作:伴随矩阵。后面再详细的搬运一波内容。

这个是2X2矩阵的逆矩阵,我们可以验证一下:


那么继续逆矩阵的内容

有一个矩阵A:
A=[abcd]=[8246] A=\begin{bmatrix}a & b \\ c & d\end{bmatrix}=\begin{bmatrix}8 & -2 \\ 4 & 6\end{bmatrix}

A的逆矩阵为:
A1=1adbc[dbca]A^{-1}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}
A1=186(2)4[6(2)48]A^{-1}=\frac{1}{8\cdot 6-(-2)\cdot 4}\cdot\begin{bmatrix}6 & -(-2) \\ -4 & 8\end{bmatrix}
A1=148+8[6248]A^{-1}=\frac{1}{48+8}\cdot\begin{bmatrix}6 & 2 \\ -4 & 8\end{bmatrix}
A1=156[6248]A^{-1}=\frac{1}{56}\cdot\begin{bmatrix}6 & 2 \\ -4 & 8\end{bmatrix}
A1=[6156215641568156]A^{-1}=\begin{bmatrix}6\cdot \frac{1}{56} & 2 \cdot \frac{1}{56} \\ -4 \cdot \frac{1}{56} & 8 \cdot \frac{1}{56}\end{bmatrix}
A1=[656256456856]A^{-1}=\begin{bmatrix}\frac{6}{56} & \frac{2}{56} \\ -\frac{4}{56} & \frac{8}{56}\end{bmatrix}

OK,现在计算得A1=[656256456856]A^{-1}=\begin{bmatrix}\frac{6}{56} & \frac{2}{56} \\ -\frac{4}{56} & \frac{8}{56}\end{bmatrix},然将与A=[8246]A=\begin{bmatrix}8 & -2 \\ 4 & 6\end{bmatrix}相乘,结果看看是否等于II

A1A=IA^{-1}\cdot A = I

[656256456856][8246]=[1001] \begin{bmatrix}\frac{6}{56} & \frac{2}{56} \\ -\frac{4}{56} & \frac{8}{56}\end{bmatrix} \cdot \begin{bmatrix}8 & -2 \\ 4 & 6\end{bmatrix}=\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}

[6856+24566(2)56+26564856+84564(2)56+8656]=[1001] \begin{bmatrix}\frac{6 \cdot 8}{56} + \frac{2 \cdot 4}{56} & \frac{6 \cdot (-2)}{56} + \frac{2 \cdot 6}{56} \\ -\frac{4\cdot 8}{56} + \frac{8\cdot 4}{56} & -\frac{4\cdot (-2)}{56} + \frac{8 \cdot 6}{56}\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}

[4856+8561256+12563256+3256856+4856]=[1001] \begin{bmatrix}\frac{48}{56} + \frac{8}{56} & \frac{-12}{56} + \frac{12}{56} \\ -\frac{32}{56} + \frac{32}{56} & \frac{8}{56} + \frac{48}{56}\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}

[5656005656]=[1001] \begin{bmatrix}\frac{56}{56} & 0 \\ 0 & \frac{56}{56}\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}

[1001]=[1001] \begin{bmatrix}1& 0 \\ 0 & 1\end{bmatrix} =\begin{bmatrix}1 & 0 \\ 0 & 1\end{bmatrix}

OK,计算完毕。反过来的:AA1=IA\cdot A^{-1} = I也是一样的。

还有另一个中计算:Matrix Inverse – 逆矩阵,这种方式可视化是以行向量来分析求解的。

而我们上面使用的是列,建议使用列的方式,更加贴合各种软件中计算。


矩阵的逆矩阵不一定存在,由几种方式可以判断来,先看看二维的逆矩阵的公式:
A1=1A[dbca]=1adbc[dbca]A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}

此公式中:det(A)=A=adbcdet(A)=|A|=ad-bc

如果A=0|A|=0,那么这个式子就A1A^{-1}的公式中会有除以00而无意义。

因为A=adbc=0|A|=ad-bc=0,所以A1A^{-1}矩阵有无意义,会是否存在,取决于AA矩阵列向量的值。

如果细心观察,可以看出:A=[abcd]A=\begin{bmatrix}a & b\\c & d\end{bmatrix},矩阵AA的第一列向量是:[ac]\begin{bmatrix}a\\c\end{bmatrix},第二列向量是:[bd]\begin{bmatrix}b\\d\end{bmatrix},而A=adbc|A|=ad-bc,其实就是:两列向量的叉乘:[ac]×[bd]=adbc\begin{bmatrix}a\\c\end{bmatrix} \times \begin{bmatrix}b\\d\end{bmatrix}=ad-bc

两个非零向量叉乘的结果为0的时候就只有这两个向量是:相同方向,或是相反方向的,即:两向量共线。

所以如果一个二维变换矩阵的列向量如果向量是共线的,那么该矩阵就没有逆矩阵。

而按行列式,或是determinant的理解就是:如果一个二维变换矩阵的行列式为0,就是变换矩阵的基围起来的空间大小为0(这里的大小至少是面积、体积,或以上),那么此变换矩阵没有逆矩阵。

所以在判断二维矩阵的逆矩阵是否存在,可以根据以下几种方式:

  • 用式子来总结:A1=1A[dbca]A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix},当A=0|A|=0,则A1A^{-1}无意义,则AA的逆矩阵A1A^{-1}不存在。
  • 而:A=0|A|=0,也代表:adbc=0ad-bc=0,也代表:ad=bcad=bc,也代表:ab=cd\frac{a}{b}=\frac{c}{d},则AA不存在逆矩阵。
  • 而:ab=cd\frac{a}{b}=\frac{c}{d},也可以看成是:k=ab=cdk=\frac{a}{b}=\frac{c}{d},类似直线斜率的方式,就像 Matrix Inverse – 逆矩阵 中最后是以[abcd]\begin{bmatrix}\color{#ff0000}a & \color{#ff0000}b \\ \color{#00ff00}c & \color{#00ff00}d\end{bmatrix}中的量行的数值分别当作是直线的斜率:ab=cd{\color{#ff0000}\frac{a}{b}}={\color{#00ff00}\frac{c}{d}},则AA也不存在逆矩阵。
  • 而:ad=bcad=bc,除了可以推导出:k=ab=cdk=\frac{a}{b}=\frac{c}{d},也一样可以按:ac=cb\frac{a}{c}=\frac{c}{b}来判断,这样就是列向量当作直线,并比较它们两的斜率。

上面的直线斜率的方式,可以以这种方式来看待矩阵,就像是直线方程组,把矩阵的元素当作是方程组中的系数:
[abcd][xy]=[ef] \begin{bmatrix} a & b\\ c & d \end{bmatrix} \cdot \begin{bmatrix} x\\ y \end{bmatrix} =\begin{bmatrix} e\\ f \end{bmatrix}

它其实就是:
[ac]x+[bd]y=[ef] \begin{bmatrix} a \\ c \end{bmatrix} \cdot x + \begin{bmatrix} b \\ d \end{bmatrix} \cdot y =\begin{bmatrix} e\\ f \end{bmatrix}

写成:
ax+by=eax+dy=f ax + by = e\\ ax + dy = f

变形以下:
by=ax+edy=ax+f by = -ax + e\\ dy = -ax + f
再变形:
y=abx+eby=adx+fd y = -\frac{a}{b}x + \frac{e}{b}\\ y = -\frac{a}{d}x + \frac{f}{d}

OK,在看看,这个与我们的直线方程的:y=kx+by = kx + b,是否很像?

所以我们可以把:kab=adk:-\frac{ a}{b}=-\frac{a}{d},看作是斜率,然后等式两边的符号,就成了:kab=adk:\frac{ a}{b}=\frac{a}{d}

然后是直线的上下位移量:beb=fdb:\frac{e}{b}=\frac{f}{d},但是直线方程上的bb不影响行列式,因为bb只会影响直线之间是重叠共线还是平行。

所以两个直线的斜率 kk 相等了,就平行或共线了,那么矩阵的行列式就为0,那么也就不存在逆矩阵了。

还可以理解为直线方程组的各项未知数(元)的系数的话,那么说明两直线无x,y的解,此直线方程无根。因为他们是共线(无穷个交点,无穷个解)或平行(一个交点都没有,一个解都没有)了。两条直线方程有解的话,说明有一个x,y点是两条直线的交点。

这类nn阶方阵的矩阵如果 不存在 逆矩阵(determinant行列式 0),则称为:奇异 矩阵。

矩阵如果 存在 逆矩阵(determinant行列式 不为 0),则称为:非奇异 矩阵。

也可以参考百度百科的:奇异矩阵,奇异矩阵也叫:singular matrix

最后附上形象一些的图像:
在这里插入图片描述

可以看到,当矩阵中的两列向量在共线后,四边形的面积就为0了(紫色的区域大小为0),也就是行列式为0,那么这样的矩阵是没有逆矩阵的。


伴随矩阵-adjugate、adjoint matrix

伴随矩阵英文叫:adjugate matrix,也叫 adjoint matrix。

也可参考百度百科中说明:伴随矩阵

早在之前的其他文章中有表述过,数学是需要很高洞察力的学科,需要去观察它的规律。

然后聪明的人类发明了数学公式符号来表示这些规律,如:斐波那契数列、对数,指数,三角函数,等等,等等,这些都有一些简洁的公式,这里就不一一搬砖了,可自行搜索。

而伴随矩阵也是被这些数学家们发现了它的特性,它的作用,也可以用于计算出逆矩阵而用的。
(这里我猜测是数学家们先计算出了逆矩阵的方法,可能计算过程太过于繁琐,然后提炼到最精简的结果时,发现了这一结果是可以从现有矩阵中的数值来求出来的,但它到底是怎么被发现的,这一历史没有记录,我也搜索不到,但这些过程是非常有参考意义的,我也惊讶于竟然没有记录,如果有记录的话,会对后人可能有更多的理解,或是更多特性的发现)

下面我引用百度百科中的一句:

如果二维矩阵可逆,那么它的逆矩阵和它的伴随矩阵之间只差一个系数,对多维矩阵也存在这个规律。

照搬一下之前的求矩阵AA的逆矩阵的公式:

A1=1A[dbca]=1adbc[dbca]A^{-1}=\frac{1}{|A|}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}=\frac{1}{ad-bc}\cdot\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}

矩阵 [dbca]\begin{bmatrix}d & -b \\ -c & a\end{bmatrix} 就是伴随矩阵。

留意上面引用百度百科说的,它(伴随矩阵)与逆矩阵就差一个系数,这个系数就是:determinant的倒数,即:矩阵行列式的倒数:1det(A)=1A\frac{1}{det(A)}=\frac{1}{|A|}二维中(或说是二阶方阵) 的这个系数就是:1adbc\frac{1}{ad-bc}

就像上面所说的,至于这个伴随矩阵是怎么得来的,之前我只是简单的描述的一下:

矩阵[dbca]\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}是怎么来的,它看起来就像是a与d交换,b,c添加了负数

这是我个人观察的规律,但其实它是由一段公式计算出来的,只不过二维矩阵的伴随矩阵比较简单的规律。

但如果要计算N维(或说N阶)矩阵时,还是需要用公式来计算好些,因为大于二维以上的矩阵的伴随矩阵的计算复杂度会越来越大。

说是有一个公式可以算出来的,但伴随矩阵的式子又是怎么来的,我们也不知道,查找的资料中没有收录这方面的信息,它的公式是:

矩阵AA的伴随矩阵,记作:AA^*,它的式子为:

注意AA^*的每项元素做了调整从:AA_{\red行\green列}位置上的值调整为:AA_{\green列\red行}的值(注意下标左边还是表示 ,右边的还是表示 ,上面说的只是他们的转置情况)。可以理解为 伴随矩阵 处理了 转置过 的,就是 行和列对调过 的。
A=[A11A12A1nA21A22A2nAn1An2Ann] A^*=\begin{bmatrix} A_{\red 1\green 1} & A_{\red 1\green 2} & \cdots & A_{\red 1\green n} \\ A_{\red 2\green 1} & A_{\red 2\green 2} & \cdots & A_{\red 2\green n} \\ \vdots & \vdots & \ddots & \vdots \\ A_{\red n\green 1} & A_{\red n\green 2} & \cdots & A_{\red n\green n} \end{bmatrix}

这是错误的,之前没有留意到这个下标不一样,导致我在后续验算是发现结果不对,-_-!!!:
在这里插入图片描述

下面的结果是 转置后 的,才是对的:

A=[A11A21An1A12A22An2A1nA2nAnn] A^*=\begin{bmatrix} A_{\green 1\red 1} & A_{\green 2\red 1} & \cdots & A_{\green n\red 1} \\ A_{\green 1\red 2} & A_{\green 2\red 2} & \cdots & A_{\green n\red 2} \\ \vdots & \vdots & \ddots & \vdots \\ A_{\green 1\red n} & A_{\green 2\red n} & \cdots & A_{\green n\red n} \end{bmatrix}

在这里插入图片描述

矩阵中的元素AijA_{ij}代数余子式,下面会讲到。

假设有个3x3矩阵AA
A=[a11a12a13a21a22a23a31a32a33] A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}

要求伴随矩阵,我们又要先了解下面要讲到:余子式MijM_{ij}。后面再加以详细的搬砖。

我们要求得矩阵AA的伴随矩阵就等于:它的矩阵AA每一项元素的 代数余子式。这里又有一个术语:代数余子式Aij=(1)i+jMijA_{ij}=(-1)^{i+j} \cdot M_{ij}(如果要我用一个表情,我会用一个:捂脸哭笑的表情)。

余子式MijM_{ij}代数余子式Aij=(1)i+jMijA_{ij}=(-1)^{i+j} \cdot M_{ij} 在公式上看的话,后者会多了一个符号的计算:(1)i+j(-1)^{i+j}。后面在加以详细的搬砖。现在先跳过,那么继续伴随矩阵的计算:

所以AA^* 中每一项 代数与字数 也等于 带符号余子式
A=[A11A21An1A12A22An2A1nA2nAnn]=[(1)1+1M11(1)2+1M21(1)n+1Mn1(1)1+2M12(1)2+2M22(1)n+2Mn2(1)1+nM1n(1)2+nM2n(1)n+nMnn] A^*=\begin{bmatrix} A_{11} & A_{21} & \cdots & A_{n1} \\ A_{12} & A_{22} & \cdots & A_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ A_{1n} & A_{2n} & \cdots & A_{nn} \end{bmatrix}=\begin{bmatrix} (-1)^{1+1}\cdot M_{11} & (-1)^{2+1}\cdot M_{21} & \cdots & (-1)^{n+1}\cdot M_{n1} \\ (-1)^{1+2}\cdot M_{12} & (-1)^{2+2}\cdot M_{22} & \cdots & (-1)^{n+2}\cdot M_{n2} \\ \vdots & \vdots & \ddots & \vdots \\ (-1)^{1+n}\cdot M_{1n} & (-1)^{2+n}\cdot M_{2n} & \cdots & (-1)^{n+n}\cdot M_{nn} \end{bmatrix}

在我们这个3x3矩阵AA例子中就是(注意行列 下标转置 过的):
A=[A11A21A31A12A22A32A13A23A33] A^*=\begin{bmatrix} A_{\green 1\red 1} & A_{\green 2\red 1} & A_{\green 3\red 1} \\ A_{\green 1\red 2} & A_{\green 2\red 2} & A_{\green 3\red 2} \\ A_{\green 1\red 3} & A_{\green 2\red 3} & A_{\green 3\red 3} \end{bmatrix}


余子式-Cofactor、Minor

余子式:英文叫:Cofactor,或:Minor,有辅助因子,或是辅助项,次级项,等意思。

余子式它的符号记作:MijM_{ij}iijj分别是第ii行和第jj列的意思,MijM_{ij}代表的就是减去第ii行和第jj列后的n-1方阵的行列式。这里先来个简述,后面会重复强调意思。

而中文的理解中在于:“”字。然后又是令人费解的“”字。

  • 字:减去对应的的行与列之后剩余的所有项,重组的新的n-1方阵。
  • 字:教你理解这个“”子的方法,你可以把它理解成编程语言中的:表达式。而编程中的表达式最终会有一个值的,所以就是表达式,就是会得到一个的式子。(前面说的 行列式 中的“式”字也是可以这么理解的)

因为它是从原始n方阵中,减去对应的的第ii行与第jj列之后剩余的所有项,重组的新的n-1方阵的 行列式注意它是一个余项组成而成的n-1方阵的行列式(determinant),所以它将会是一个):

还是用回上面的个3x3矩阵AA

A=[a11a12a13a21a22a23a31a32a33] A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}

中,假设我要求第2行第1列的余子式,先分两步:

  • 先得出 余项,因为是原来的一部分的项目,所以我们叫:余子项
  • 再根据 余子项 来求这个 余子项行列式,所以简称 余子式

余子项

2行第1列的余子项:

先将要删除的第2行第1列的所有项的用红色标出来:
A=[a11a12a13a21a22a23a31a32a33] A=\begin{bmatrix} \color{#ff0000}a_{11} & a_{12} & a_{13} \\ \color{#ff0000}a_{21} & \color{#ff0000}a_{22} & \color{#ff0000}a_{23} \\ \color{#ff0000}a_{31} & a_{32} & a_{33} \end{bmatrix}

再将这些项删除:
A=[a12a13a32a33] A=\begin{bmatrix} \color{#ff0000}删除 & a_{12} & a_{13} \\ \color{#ff0000}删除 & \color{#ff0000}删除 & \color{#ff0000}删除 \\ \color{#ff0000}删除 & a_{32} & a_{33} \end{bmatrix}

删除,得到 余子项
B21=[a12a13a32a33] B_{21}=\begin{bmatrix} a_{12} & a_{13} \\ a_{32} & a_{33} \end{bmatrix}


余子式

然后是这个用这个 余子项 来来计算矩阵BB行列式(determinant)

那么 余子式 记作 MijM_{ij},我们的ii2jj1

M21=det(B21)=[a12a13a32a33]=a12a33a13a32 M_{21}=det(B_{21})=\begin{bmatrix} \color{#ff0000}a_{12} & \color{#00aa00}a_{13} \\ \color{#00aa00}a_{32} & \color{#ff0000}a_{33} \end{bmatrix} ={\color{#ff0000}a_{12}\cdot a_{33}} - {\color{#00aa00}a_{13} \cdot a_{32}}

然后是:其他的MijM_{ij}都可以使用这种方法计算出对应3x3矩阵中的每一项元素的余子式。


代数余子式-Algebraic cofactor、Minor

我们前面说了伴随矩阵就是每一项的 代数余子式

余子式代数余子式 的区别前面也说过,这里再重新强调一下:

余子式MijM_{ij}代数余子式Aij=(1)i+jMijA_{ij}=(-1)^{i+j} \cdot M_{ij} 在公式上看的话,后者会多了一个符号的计算:(1)i+j(-1)^{i+j}

那第i=2i=2j=1j=1Aij=A21A_{ij}=A_{21}

A21=(1)2+1M21 A_{21}=(-1)^{2+1} \cdot M_{21}

A21=(1)3M21 A_{21}=(-1)^{3} \cdot M_{21}

A21=M21 A_{21}=-M_{21}

那么我们将之前3x3的矩阵AA的每一项元素的 代数余子式 计算得出:

(上面的矩阵AA跑太远了,这里再复制过来,方便阅读)
A=[a11a12a13a21a22a23a31a32a33] A=\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}

矩阵AA的伴随矩阵AA^*为每一项的 代数余字数 (注意行列 下标转置 过的):
A=[A11A21A31A12A22A32A13A23A33] A^*=\begin{bmatrix} A_{\green 1\red 1} & A_{\green 2\red 1} & A_{\green 3\red 1} \\ A_{\green 1\red 2} & A_{\green 2\red 2} & A_{\green 3\red 2} \\ A_{\green 1\red 3} & A_{\green 2\red 3} & A_{\green 3\red 3} \end{bmatrix}

因为:Aij=(1)i+jMijA_{ij}=(-1)^{i+j} \cdot M_{ij},所以式子可以调整为:

A=[(1)1+1M11(1)2+1M21(1)3+1M31(1)1+2M12(1)2+2M22(1)3+2M32(1)1+3M13(1)2+3M32(1)3+3M33] A^*=\begin{bmatrix} (-1)^{1+1}\cdot M_{11} & (-1)^{2+1}\cdot M_{21} & (-1)^{3+1}\cdot M_{31} \\ (-1)^{1+2}\cdot M_{12} & (-1)^{2+2}\cdot M_{22} & (-1)^{3+2}\cdot M_{32} \\ (-1)^{1+3}\cdot M_{13} & (-1)^{2+3}\cdot M_{32} & (-1)^{3+3}\cdot M_{33} \end{bmatrix}

A=[(1)2M11(1)3M21(1)4M31(1)3M12(1)4M22(1)5M32(1)4M13(1)5M23(1)6M33] A^*=\begin{bmatrix} (-1)^{2}\cdot M_{11} & (-1)^{3}\cdot M_{21} & (-1)^{4}\cdot M_{31} \\ (-1)^{3}\cdot M_{12} & (-1)^{4}\cdot M_{22} & (-1)^{5}\cdot M_{32} \\ (-1)^{4}\cdot M_{13} & (-1)^{5}\cdot M_{23} & (-1)^{6}\cdot M_{33} \end{bmatrix}

为了对齐,我把正负号的 代数余字数+ 也标出来,因为它就是带符号的 余子式
A=[+M11M21+M31M12+M22M32+M13M23+M33] A^*=\begin{bmatrix} +M_{11} & -M_{21} & +M_{31} \\ -M_{12} & +M_{22} & -M_{32} \\ +M_{13} & -M_{23} & +M_{33} \end{bmatrix}


伴随矩阵-二维的例子

那么来计算最简单的二维矩阵,求:二维矩阵的伴随矩阵。

就用我们前门最简单的2x2矩阵:A=[abcd]A=\begin{bmatrix}a & b \\ c & d\end{bmatrix},它的 伴随矩阵 是:A=[dbca]A^*=\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}

下面来看看它的AA^*是怎么计算得来的(注意行列 下标转置 过的):
A=[A11A21A12A22] A^*=\begin{bmatrix}A_{11} & A_{21} \\ A_{12} & A_{22}\end{bmatrix}

那看看A11,A12,A21,A22A_{11},A_{12},A_{21},A_{22}分别都是怎么计算的:

M11=[abcd],删除1行1列:M11=[d],A11=(1)1+1M11=(1)2[d]=dM_{11} =\begin{bmatrix}\color{#ff0000}a & \color{#ff0000}b \\ \color{#ff0000}c &{\color{00dd00}d} \end{bmatrix} ,\text{删除1行1列:} M_{11} =[{\color{00dd00}d}], A_{11}=(-1)^{1+1} \cdot M_{11}=(-1)^{2} \cdot [{\color{00dd00}d}]={\color{00dd00}d},所以A11=d\color{#ff0000}A_{11}=d

M12=[abcd],删除1行2列:M12=[c],A12=(1)1+2M12=(1)3[c]=cM_{12} =\begin{bmatrix}\color{#ff0000}a & \color{#ff0000}b \\ {\color{00dd00}c} & \color{#ff0000}d\end{bmatrix} ,\text{删除1行2列:} M_{12} =[{\color{00dd00}c}], A_{12}=(-1)^{1+2} \cdot M_{12}=(-1)^{3} \cdot [{\color{00dd00}c}]=-{\color{00dd00}c},所以A12=c\color{#ff0000}A_{12}=-c

M21=[abcd],删除2行1列:M21=[b],A21=(1)2+1M21=(1)3[b]=bM_{21} =\begin{bmatrix}\color{#ff0000}a & {\color{00dd00}b} \\ \color{#ff0000}c & \color{#ff0000}d\end{bmatrix} ,\text{删除2行1列:} M_{21} =[{\color{00dd00}b}], A_{21}=(-1)^{2+1} \cdot M_{21}=(-1)^{3} \cdot [{\color{00dd00}b}]=-{\color{00dd00}b},所以A21=b\color{#ff0000}A_{21}=-b

M22=[abcd],删除2行2列:M22=[a],A22=(1)2+2M22=(1)4[a]=aM_{22} =\begin{bmatrix}{\color{00dd00}a} & \color{#ff0000}b \\ \color{#ff0000}c & \color{#ff0000}d\end{bmatrix} ,\text{删除2行2列:} M_{22} =[{\color{00dd00}a}], A_{22}=(-1)^{2+2} \cdot M_{22}=(-1)^{4} \cdot [{\color{00dd00}a}]={\color{00dd00}a},所以A22=a\color{#ff0000}A_{22}=a

OK,现在A11,A12,A21,A22A_{11},A_{12},A_{21},A_{22}都计算好了。

分别代回伴随矩阵(注意行列 下标转置 过的):A=[A11A21A12A22]=[dbca]A^*=\begin{bmatrix}A_{11} & A_{21} \\ A_{12} & A_{22}\end{bmatrix}=\begin{bmatrix}\color{#ff0000}d & \color{#ff0000}-b \\ \color{#ff0000}-c & \color{#ff0000}a\end{bmatrix}

所以你会看到这个结果就是我之前说的结果。

二维矩阵的伴随矩阵很简单,所以直接总结为之前说的简单处理:“矩阵[dbca]\begin{bmatrix}d & -b \\ -c & a\end{bmatrix}是怎么来的,它看起来就像是a与d交换,b,c添加了负数

再根据之前描述说的,伴随矩阵逆矩阵 就差一个 系数值,这个系数值就是 矩阵的行列式的倒数

然后我们使用 矩阵的行列式的倒数 的结果,数乘伴随矩阵 得到的就是 逆矩阵

矩阵的行列式 . 伴随矩阵 = 逆矩阵:A1=1AAA^{-1}=\frac{1}{|A|} \cdot A^*

如果已知 逆矩阵矩阵行列式,那么 伴随矩阵A=AA1A^* = |A| \cdot A^{-1}


总结 & 练习

前面说明,逆矩阵A1A^{-1}作用就是将某个向量A\overrightarrow A 应用了矩阵AA变换成的结果B\overrightarrow B 的结果再反向变换回矩阵变换前的A\overrightarrow A
AA=BA1B=A A \cdot \overrightarrow A=\overrightarrow B\\ \\ A^{-1} \cdot \overrightarrow B= \overrightarrow A

这种应用是非常广泛的,矩阵Unity中大家都应该熟悉的:GameObject 下的 Transform 组件类有 LocationPositionPosition

  • LocationPosition 是对象的局部座标
  • Position 是世界座标

假设有GameObject A,B,C,他们的父级关系是:A是B的父级,B是C的父级:

A
|
+--->B
	 |
	 +--->C

如果A,B有缩放、旋转、位移过,这时想在脚本里设置C的世界的标对齐到场景中某个对象D的世界位置对齐。

为了方便,直接设置某个C的Position等于D的Position即可,伪代码如下:

GameObject A, B, C, D;

void Start() {
	B.Transform.SetParent(A.Transform);
	C.Transform.SetParent(B.Transform);

	D.Transform.SetParent(.....);
}

void C_Locate_to_D() {
	C.Transform.Position = D.Transform.Position;
}

主要看:C.Transform.Position = D.Transform.Position; 这句即可,它内部处理起始用了逆矩阵来更新LocationPosition,这样外部用起来就相当方便了。

Transform 类的代码中,设置 Position 的伪代码大概如下:

class Transform {
	Matrix4x4 local2worldMatrix; 			// local 局部座标 变换到 world 世界座标的矩阵
	Matrix4x4 world2localnMatrix;			// world 世界座标 变换到 local 矩阵座标的矩阵,它就是location2worldMatrix矩阵的逆矩阵
	
	public Vector3 Position {
		get => position;
		set {
			position = value;
			localPosition= world2localnMatrix.MultiplePoint(position); // 根据 世界座标 反向变换回 局部座标
		}
	}
	
	public Vector3 LocationPosition {
		get => localPosition;
		set { localPosition= value; }
	}

	private Vector3 position;				// 世界座标
	private Vector3 localPosition;			// 矩阵座标
}

这就有点像是上面说过的:

假设有一个 局部座标世界座标 的变换矩阵 Matlw2Mat_{lw2}(lw2==Local To World 的简写):
Matl2w=[abcd]Mat_{l2w}=\begin{bmatrix}a & b\\c & d\end{bmatrix}
然后是 Matl2wMat_{l2w} 的逆矩阵 Matw2lMat_{w2l}(w2l==World To Local),它的作用是 世界座标局部座标 的变换:
Matw2l=1adbc[dbca]Mat_{w2l}=\frac{1}{ad-bc}\cdot \begin{bmatrix}d & -b\\-c & a\end{bmatrix}

然后是 局部座标 PoslPos_{l}(l==Local):
Posl=[xlyl]Pos_{l}=\begin{bmatrix}x_{l}\\y_{l}\end{bmatrix}

然后是 世界座标 PoswPos_{w}(w==World):
Posw=[xwyw]Pos_{w}=\begin{bmatrix}x_{w}\\y_{w}\end{bmatrix}

那么 将 局部座标 变换到 世界座标

Matl2wPosl=Posw Mat_{l2w} \cdot Pos_{l} = Pos_{w}

[abcd][xlyl]=[xwyw] \begin{bmatrix} a & b\\ c & d \end{bmatrix} \cdot \begin{bmatrix} x_{l}\\y_{l} \end{bmatrix} =\begin{bmatrix} x_{w}\\y_{w} \end{bmatrix}

那么 将 世界座标 变换到 局部座标

Matw2lPosw=Posl Mat_{w2l} \cdot Pos_{w} = Pos_{l}

1adbc[dbca][xwyw]=[xlyl] \frac{1}{ad-bc}\cdot \begin{bmatrix}d & -b\\-c & a\end{bmatrix} \cdot \begin{bmatrix} x_{w}\\y_{w} \end{bmatrix} =\begin{bmatrix} x_{l}\\y_{l} \end{bmatrix}

最后的通过设置世界座标的 PoswPos_{w} 时,我们是已知 PoswPos_{w} 世界座标点的,和 Matw2lMat_{w2l} 都是已知的,求 PoslPos_{l} 是肯定可以的。

Matw2lPosw=Posl Mat_{w2l} \cdot Pos_{w} = Pos_{l}

但最终的终极理解这个变换,你可以这么理解(可参考 可汗学院 里的视频:Matrix world problem: vector combination):
Matw2lMat_{w2l}的第一列向量就是w2lw2l 座标系下的 X 轴:[x1y1]\begin{bmatrix}x_1 \\ y_1\end{bmatrix},第二列向量就是 w2lw2l 座标系下的 Y 轴:[x2y2]\begin{bmatrix}x_2 \\ y_2\end{bmatrix},这两个轴分别缩放 [xwyw]\begin{bmatrix}x_w\\ y_w\end{bmatrix} 后,再相加(两个轴,或是两个向量相加),就等于 [xlyl]\begin{bmatrix}x_l \\ y_l\end{bmatrix}
[x1x2y1y2][xwyw]=[xlyl] \begin{bmatrix}x_1 & x_2\\ y_1 & y_2\end{bmatrix} \cdot \begin{bmatrix}x_w\\y_w\end{bmatrix}=\begin{bmatrix}x_l \\ y_l\end{bmatrix}

调整为:
[x1y1]xw+[x2y2]yw=[xlyl] \begin{bmatrix}x_1 \\ y_1 \end{bmatrix} \cdot x_w + \begin{bmatrix}x_2 \\ y_2 \end{bmatrix} \cdot y_w = \begin{bmatrix}x_l \\ y_l\end{bmatrix}

调整为文字+公式:
W2Lxxw+W2Lyyw=(W2Lx,,xw)+(W2Ly,,yw)= W2L的轴_x \cdot x_w + W2L的轴_y \cdot y_w = 局部座标\\ (W2L的轴_x向量,放大,世界座标的x_w倍) + (W2L的轴_y向量,放大,世界座标的y_w倍)= 局部座标
(但注意这里的W2L的X,Y轴,可能都是缩放、旋转过的)

然后我在 可汗学院 的小考的里题目做测试,带上鼠标绘制(我的画板不见了)的过程与提交结果:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


References

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章