矩陣(一)

概述:

矩陣(Matrix)在計算機幾何中主要用來轉換座標系,經過定義一種運算規則將一個座標系中的向量轉換到另外一個座標系中。常見於對模型的旋轉,平移,縮放等等操做。算法

矩陣的維度:

矩陣的行數和列數記作維度,如一個r x c的矩陣有r行和c列,記法:
image.png
m22 表示矩陣M的第二行和第二列的元素,如上面矩陣的第2行第2列是數字9spa

方陣:

行數等於列數的矩陣叫作方陣。常見的方陣有2x2,3x3,4x4,以下:
image.png
另外方陣的行號和列號相同的元素稱爲對角線元素,如 m11,m22,m33,m44若是對角線元素不是0,而其餘元素都是0的話,那麼這個矩陣叫作對角矩陣。因此對角矩陣必定是方陣,可是方陣不必定都是對角矩陣,對角矩陣以下:
image.png
單位矩陣是一種特殊的對角矩陣,由於對角線元素都爲1,以下:
image.png
而且能夠發現任何矩陣乘以單位矩陣,都獲得原來的矩陣。3d

矩陣的轉置:

矩陣的轉置記爲:MT,矩陣經過轉置,能夠獲得另一個矩陣,好比矩陣M有r行和c列,對矩陣M進行轉置,那麼MT是有c行和r列的一個矩陣,也就是原來矩陣的每一行,變成轉置矩陣的每一列,原矩陣M的 mij = 等於轉置矩陣MT的mji如:
image.png
另外單位矩陣的轉置仍是原來的矩陣。一個矩陣的轉置的轉置等於原矩陣(MT)T =M
矩陣轉置的用途主要是爲了兼用行向量和列向量的計算,由於有些程序算法是基於DirectX編寫的,而DirectX使用的是行向量和矩陣相乘,有些程序算法是基於OpenGL編寫的,而OpenGL使用的列向量和矩陣相乘。若是別人的程序是基於DirectX編寫,而且本身用的是OpenGL平臺,那麼在使用別人的程序和算法的時候,就要對矩陣進行轉置而且把行向量變成列向量,避免形式不同致使錯誤(行向量和列向量和矩陣的乘法本篇後面會有說明)blog

標量和矩陣的乘法:

一個標量k乘以一個矩陣,等於用k乘以矩陣的每個元素:
image.png
image.png圖片

矩陣和矩陣的乘法

  • 矩陣乘法定義

兩個矩陣不是均可以相乘的,須要知足必定的條件:第一個矩陣的列數須要和第二個矩陣的行數相同(由於矩陣的乘法規定用矩陣A的行元素乘以矩陣B的列的元素)那麼這兩個矩陣才能相乘,假如矩陣A是3行2列,矩陣B是2行4列,那麼矩陣A乘以矩陣B的結果是一個3 x 4的矩陣(3行4列的矩陣):
image.pngrem

  • 矩陣乘法運算規則

矩陣AB相乘以後的矩形C的元素mij等於矩陣A的i行和矩陣B的j列點乘的結果,如:矩陣C的第一行第二列m12等於矩陣A第一行的元素a11,a12和矩陣第二列元素b12,b22 點乘獲得的結果: m12=a11b12+a12b22
兩行兩列2x2的矩陣之間相乘的運算規則以下:
image.png
image.png
一樣的道理三行三列3 x 3矩陣之間相乘的運算規則以下:
image.png
例如:
image.png
4 x 4的矩陣相似,這裏再也不贅述。
另外,矩陣乘以矩陣的轉置矩陣,等於把兩矩陣裝置以後,從相反的順序乘,如:
image.pngit

向量和矩陣的乘法

根據矩陣的乘法規則,行向量只能放在矩陣的左邊和矩陣相乘,列向量只能放在矩陣的右邊和矩陣相乘
image.png
能夠看出,行向量和列向量相乘得出的結果是不同的。列向量和矩陣相乘若是想和行向量獲得相同的結果,須要把矩陣轉置以後再和列向量相乘:
image.png
行向量和列向量只是書寫的方式不一樣,通常能夠認爲是相等的向量,它們之間能夠相互轉換,可是當行向量和列向量和矩陣相乘的順序須要注意,若是一個行向量,和多個矩陣相乘,那麼是從左到右相乘,若是一個列向量和多個矩陣相乘,則是從右到左相乘的。如:
若是向量v是行向量乘以矩陣ABC等於vABC,從左邊乘到右邊
若是向量v是列向量乘以矩陣ABC等於CBAv,從右邊乘到左邊
而且DirectX使用的是行向量寫法,OpenGL使用的是列向量的寫法,而且若是矩陣是基於Directx定義的,若是要在OpenGL中使用,須要對矩陣進行轉置,再和列向量右乘,這樣纔是正確的。class

矩陣的幾何解析:

在計算機圖形學中,矩陣的重要意義是對向量進行轉換,那麼矩陣是如何轉換向量的呢?
由於一個向量能夠解釋成按照必定的軸位移序列如向量[2 3 5]能夠拆分開三個位移向量[2 0 0],[0 3 0],[0 0 5]也就是先位移X軸2個單位,再移動Y軸3個單位,再移動Z軸5個單位,向量能夠拆分紅以下形式:
image.png
咱們定義p,q和r是+x,+y和+z方向的單位向量,也就是p =[1 0 0],q =[0 1 0],r=[0 0 1]那麼上面的向量v能夠這樣表示:v = xp+yq+zr=2p+3q+5r
咱們能夠用p,q,r構造一個3x3的矩陣M
image.png
用一個向量乘以矩陣獲得:
image.png
把行向量寫成列向量的形式:
image.png
這和前面拆分向量的v的等式相同,一個向量乘以矩陣獲得一個新的向量,用向量乘以這個矩陣就相等於對向量進行轉化,記爲:aM = b,那麼認爲,矩陣M將向量a轉化爲向量b程序

單位向量乘以矩陣:

image.png
用基向量[1 0 0]乘以矩陣M結果是矩陣M的第一行[m11 m12 m13],基向量[0 1 0]乘以矩陣M的結果是矩陣M的第二行[m21 m22 m23],基向量[0,0,1]乘以矩陣M的結果是矩陣M的第三行[m31 m32 m33]那麼咱們能夠認爲矩陣的第一行是對基向量[1 0 0]進行了轉換,結果是矩陣的第一行,矩陣的第二行是對基向量[0 1 0]進行了轉換,結果是矩陣的第二行,矩陣的第三行對基向量[0 0 1]進行了轉換,結果是矩陣的第三行
咱們先看一下2D的例子用2行2列的矩陣表示:
image.png
以下圖,矩陣對向量進行了轉換:
image.png
至關於把[1 0] [0 1]所圍成的矩形轉換成[1 2][-2 4]圍成的平行四邊形
image.png
實際的使用例子如把一張圖片進行轉換,轉換以前:
image.png
進行轉換以後:
image.pngim

一樣的道理咱們也能夠用到3D的轉換中,咱們先不要轉換Z軸,不然看起來太亂。因此矩陣第三行是[0 0 1],如:
image.png
image.png
至關於把[1 0 0][0 1 0][0 0 1]所圍成的立方體轉換成了以[0.707 -0.707 0][1.25 1.25 0][0 0 1]所構成的立方體。以下圖:
image.png
實際的使用如把一個模型進行轉換,轉換以前:
image.png
模型轉換以後,如:
image.png

相關文章
相關標籤/搜索