矩阵(一)

概述:

矩阵(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

相关文章
相关标签/搜索