矩阵学习笔记
来源:互联网 发布:雨花台网络问政 编辑:程序博客网 时间:2024/06/05 20:01
先给出一些定义:
矩阵的行列式
对于一个方阵(n*n的矩阵)A,有行列式运算记为 det A。
行列式可以看做有向面积或体积的慨念在一般的欧几里得空间中的推广。
我们这里提出行列式的目的是有为了有一种明确的数学运算工具去找到矩阵的逆。
一个方阵有逆矩阵的条件是,当且仅当其行列式不等于0
(后面再来补充)
Matrix Minors
给定一个n阶方阵(n*n Matrix),他的Minors Matrix
(后面再来补充)
定义
矩阵的行列式被递归地定义; 例如,4×4矩阵的行列式是根据3×3矩阵的行列式定义的,3×3矩阵的行列式是根据2×2矩阵的行列式定义的,2×2矩阵的行列式是根据1×1矩阵的行列式定义的。(1×1矩阵 A = [
给出nxn矩阵
回顾Matrix Minors的定义,对于一个2x2的矩阵来说,
所以可以推出
(就不写四阶的了,写公式好累,终于弄懂了这玩意儿)
The Adjoint Of A Matrix(伴随矩阵)
给定nxn矩阵
如果我们对
我们将
在龙书的后续中,将利用adjoint 找到一个确切的公式来计算逆矩阵。
矩阵的逆
矩阵运算并没有定义除法操作,但我们需要一个乘法的逆运算。
有如下summarizes:
1、只有方阵才有逆矩阵,所以当我们说矩阵的逆,我们假设我们的处理对象是一个方阵。
2、一个nxn矩阵
3、不是每一个方阵都有逆矩阵。一个矩阵若有逆矩阵,则称矩阵是可逆的(invertible),否则称矩阵是奇异的(singular)。
4、矩阵的逆矩阵若存在则是唯一的。
5、一个矩阵乘以它的逆矩阵结果为单位矩阵:
矩阵的逆在解矩阵等式时很有用,例如:
给出
现在直接给出矩阵求逆的公式:
Note:对于一个比较小的矩阵(4x4或者更小),伴随矩阵求逆的方式计算效率较高,但当矩阵比较大的时候,我们将采用Gaussian elimination方法。需要注意的是,我们在3D图形学中用到的矩阵具有一定的特殊形式。我们不需要浪费CPU时间在对于这种矩阵的求逆上(利用我们上面给出的通用公式),因为其特殊形式我们有办法提前确定矩阵逆的形式。
矩阵的逆的性质
DirectXMath库中的矩阵
对点和向量进行变换的时候,我们运用1x4的行向量和4x4的矩阵。至于原因后面会说,我们现在把目光聚焦到如何运用上。
DirectXMath中向量类为XMMATRIX
,被定义在DirectXMath.h
中:
#if (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM)) && defined(_XM_NO_INTRINSICS_)struct XMMATRIX#else__declspec(align(16)) struct XMMATRIX#endif{ // Use 4 XMVECTORs to represent the matrix for SIMD. XMVECTOR r[4]; XMMATRIX() {} // Initialize matrix by specifying 4 row vectors. XMMATRIX(FXMVECTOR R0, FXMVECTOR R1, FXMVECTOR R2, CXMVECTOR R3) { r[0] = R0; r[1] = R1; r[2] = R2; r[3] = R3; } // Initialize matrix by specifying 4 row vectors. XMMATRIX( float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33); // Pass array of sixteen floats to construct matrix. explicit XMMATRIX(_In_reads_(16) const float *pArray); XMMATRIX& operator= (const XMMATRIX& M) { r[0] = M.r[0]; r[1] = M.r[1]; r[2] = M.r[2]; r[3] = M.r[3]; return *this; } XMMATRIX operator+ () const { return *this; } XMMATRIX operator- () const; XMMATRIX& XM_CALLCONV operator+= (FXMMATRIX M); XMMATRIX& XM_CALLCONV operator-= (FXMMATRIX M); XMMATRIX& XM_CALLCONV operator*= (FXMMATRIX M); XMMATRIX& operator*= (float S);XMMATRIX& operator/= (float S); XMMATRIX XM_CALLCONV operator+ (FXMMATRIX M) const; XMMATRIX XM_CALLCONV operator- (FXMMATRIX M) const; XMMATRIX XM_CALLCONV operator* (FXMMATRIX M) const; XMMATRIX operator* (float S) const; XMMATRIX operator/ (float S) const; friend XMMATRIX XM_CALLCONV operator* (float S, FXMMATRIX M);};
可以看到,XMMATRIX
使用了4个XMVECTOR
来实现以便使用SIMD加速。并重载了代数运算的操作符。
就像向量类一样,我们在将矩阵当做类成员时,需要使用XMFLOAT4X4
类型来保存。
类似的:
//load data from XMFLOAT4X4 into XMMATRIXinline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource);//store data from XMMATRIX into XMFLOAT4X4inline void XM_CALLCONV XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIXM);
一些有用的函数:
XMMATRIX XM_CALLCONV XMMatrixIdentity();//返回单位矩阵Ibool XM_CALLCONV XMMatrixIsIdentity(FXMMATRIX M); //判断是否为单位矩阵XMMATRIX XM_CALLCONV XMMatrixMultiply( FXMMATRIX A, CXMMATRIX B);//矩阵乘法XMMATRIX XM_CALLCONV XMMatrixTranspose( FXMMATRIX M);//矩阵转置XMVECTOR XM_CALLCONV XMMatrixDeterminant(FXMMATRIX M);//计算矩阵的行列式的值XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR* pDeterminant, FXMMATRIX M);//返回逆矩阵
当XMMATRIX
传参时,遵循与XMVECTOR
一样的规则,就不在重复啦。
- 学习笔记:协方差矩阵
- 矩阵学习笔记1
- 矩阵学习笔记4
- 矩阵乘法学习笔记
- 矩阵学习笔记
- 矩阵论学习笔记四:矩阵分解
- 矩阵快速幂--学习笔记
- 矩阵论学习笔记2
- 矩阵论学习笔记3
- 灰度共生矩阵 学习笔记
- 学习笔记1--协方差矩阵
- 矩阵与线性代数学习笔记
- 【机器学习笔记】Hessian矩阵
- 机器学习基础-学习笔记 矩阵论
- 学习笔记DL004:标量、向量、矩阵、张量,矩阵、向量相乘,单位矩阵、逆矩阵
- 矩阵论学习笔记三:矩阵分析及其应用
- 矩阵论学习笔记六:广义逆矩阵
- 【矩阵与行列式】矩阵和行列式学习笔记
- android应用卸载后的监听
- Eigen的几何模块
- pat乙级1020
- nyoj1170
- react-native使用蚂蚁金服的antd-mobile组件库教程
- 矩阵学习笔记
- centos下安装apache+php环境
- 翻转链表
- Machine Learning with Scikit-Learn and Tensorflow 6.5 计算复杂度
- CDOJ 844 线段树区间最大连续和
- (译)Sympy的矩阵操作
- [sql映射]resultMap和resultType
- 并查集入门(小希的迷宫)
- pat乙级1019