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

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