一:概念
——矩阵是一个按照长方阵列排列的复数(形如z=a+bi,a和b均为实数的数称为复数)或实数集合
——是一个2*3的矩阵,是一个3*2的矩阵,一个m*n的矩阵A中,一共有m行,n列,一共有m*n个数,Aij代表第i行第j列的数,在数学中矩阵的下标是从1开始的
二:Unity中定义一个矩阵
——在数学中,矩阵的下标是从1开始的,但是在Unity里下标仍是从0开始
——Unity中使用SetRow和SetColumn定义一个矩阵,在Unity中最大只能定义维度为4的矩阵,也就是说行列的下标范围为[0,3]
——Unity中使用GetRow和GetColumn获取一个矩阵的行和列
using UnityEngine;
public class Test : MonoBehaviour
{
private Matrix4x4 matrix;
private void Start()
{
matrix.SetRow(0, new Vector4(1, 0, 0, 0));
matrix.SetRow(1, new Vector4(2, 1, 0, 0));
matrix.SetRow(2, new Vector4(3, 0, 1, 0));
matrix.SetRow(3, new Vector4(4, 0, 0, 1));
//输出矩阵
Debug.Log(matrix); //1.00000 0.00000 0.00000 0.00000
//2.00000 1.00000 0.00000 0.00000
//3.00000 0.00000 1.00000 0.00000
//4.00000 0.00000 0.00000 1.00000
//输出矩阵的某一行某一列
Vector4 row0 = matrix.GetRow(0);
Vector4 column0 = matrix.GetColumn(0);
Debug.Log(row0); //(1.0, 0.0, 0.0, 0.0)
Debug.Log(column0); //(1.0, 2.0, 3.0, 4.0)
}
}
三:矩阵的加减法
在Unity中矩阵与矩阵相加减的需求几乎不会存在,所以没有提供运算符进行计算
——矩阵的加法和减法:只有维度相同的矩阵才可以相加减,结果是矩阵各相同位置元素相加减得到的矩阵
四:矩阵的乘法
矩阵与矩阵相乘的条件:矩阵与矩阵相乘时只有满足第一个矩阵的列数和第二个矩阵的行数相等时,才可以相乘
——矩阵与标量相乘
矩阵和标量相乘得到的还是相同维度的矩阵,结果是矩阵每个元素和该标量相乘除得到的矩阵
——矩阵与向量相乘(向量可以被当成一行或一列的矩阵,例如(1,2,3)可以当作一个1*3的矩阵)
在Unity中有矩阵与向量的需求时会把向量看作为一个4X4的矩阵再相乘
矩阵与向量相乘tip:行向量写在左边,列向量写在右边,如果是与行向量相乘的话就用行向量点乘矩阵的每一列,如果是与列向量相乘的话就用列向量点乘矩阵的每一行
——矩阵与矩阵相乘
两个矩阵A和B相乘,得到的矩阵C中的元素Cij等于矩阵A的第i行与矩阵B的第j列点乘的结果
五:特殊矩阵
——方块矩阵:
行数与列数相等的矩阵叫做方块矩阵
——对角矩阵
在方块矩阵中,行号与列号相等的元素叫做对角元素,如果除了对角元素外其余元素都为0,那么这个矩阵称为对角矩阵
——单位矩阵,记作I
在对角矩阵中,对角元素都为1,那么这个矩阵称为对角矩阵
用任意一个矩阵乘以一个单位矩阵得到的结果都是原矩阵
在Unity中
使用Matrix4x4.identity获取一个4X4的单位矩阵
使用Matrix4x4.zero获取一个4X4的所有元素都为0的矩阵
使用matrix.isIdentity判断一个矩阵是否为单位矩阵
——转置矩阵
转置矩阵是对原矩阵进行转置运算后得到的矩阵,原矩阵转置后对角元素不变
例如一个r*c的矩阵转置后就是一个c*r的矩阵,将原矩阵的第i行变为第i列,第j列变为第j行
在Unity中使用Matrix4x4.Transpose(matrix)将一个矩阵进行转置运算
——逆矩阵
只有方块矩阵才可能有逆矩阵,因为一个矩阵A和它的逆矩阵B需要满足条件A*B=单位矩阵
如果一个矩阵有相应的的逆矩阵,则称这个矩阵是可逆的
在Unity中使用Matrix4x4.Inverse(matrix)求得一个矩阵得逆矩阵
判断一个矩阵是否有逆矩阵的方法:求得矩阵的行列式,如果行列式不为0则它是可逆的
1.二阶行列式计算:对角线相乘相减
2.n阶行列式计算:按照某一行或某一列展开成元素与其对应的代数余子式的乘积之和