矩阵学习笔记

先给出一些定义:
矩阵的行列式
对于一个方阵(n*n的矩阵)A,有行列式运算记为 det A。
行列式可以看做有向面积或体积的慨念在一般的欧几里得空间中的推广。
我们这里提出行列式的目的是有为了有一种明确的数学运算工具去找到矩阵的逆。
一个方阵有逆矩阵的条件是,当且仅当其行列式不等于0
(后面再来补充)

Matrix Minors
给定一个n阶方阵(n*n Matrix),他的Minors Matrix A¯¯¯ij 为去掉第i行第j列的矩阵。
(后面再来补充)

定义
矩阵的行列式被递归地定义; 例如,4×4矩阵的行列式是根据3×3矩阵的行列式定义的,3×3矩阵的行列式是根据2×2矩阵的行列式定义的,2×2矩阵的行列式是根据1×1矩阵的行列式定义的。(1×1矩阵 A = [ A11 ]的行列式被简单地定义为det [ A11 ] = A11 )。

给出nxn矩阵 A .定义:

detA=j=1nA1j(1)1+jdetA¯¯¯1j

回顾Matrix Minors的定义,对于一个2x2的矩阵来说,

det[A11A21A12A22]=A11det[A22]A12det[A21]=A11A22A12A21

所以可以推出

detA11A21A31A12A22A32A13A23A33=A11det[A22A32A23A33]A12det[A21A32A23A33]+A13det[A21A31A22A32]

(就不写四阶的了,写公式好累,终于弄懂了这玩意儿)

The Adjoint Of A Matrix(伴随矩阵)
给定nxn矩阵 A ,则Cij=(1)i+jdetA¯¯¯ij被称为cofacotr of Aij (余子式?)
如果我们对 A 所有的位置求Cij,我们得到了 A 的余子阵CA

CA=C11C21Cn1C12C22Cn2C1nC2nCnn

我们将 CA 转置,就得到了 adjoint of A (A的伴随矩阵),表示为:
A=CTA

在龙书的后续中,将利用adjoint 找到一个确切的公式来计算逆矩阵。

矩阵的逆
矩阵运算并没有定义除法操作,但我们需要一个乘法的逆运算。
有如下summarizes:
1、只有方阵才有逆矩阵,所以当我们说矩阵的逆,我们假设我们的处理对象是一个方阵。
2、一个nxn矩阵 M 的逆矩阵被表示为M1
3、不是每一个方阵都有逆矩阵。一个矩阵若有逆矩阵,则称矩阵是可逆的(invertible),否则称矩阵是奇异的(singular)。
4、矩阵的逆矩阵若存在则是唯一的。
5、一个矩阵乘以它的逆矩阵结果为单位矩阵: MM1=M1M=I 。这个时候是满足交换律的。

矩阵的逆在解矩阵等式时很有用,例如:
给出 p,M ,令 p=pM ,求 p .转换等式为p=pM1,只要求得 M 的逆即可求得p

现在直接给出矩阵求逆的公式:

A1=AdetA

Note:对于一个比较小的矩阵(4x4或者更小),伴随矩阵求逆的方式计算效率较高,但当矩阵比较大的时候,我们将采用Gaussian elimination方法。需要注意的是,我们在3D图形学中用到的矩阵具有一定的特殊形式。我们不需要浪费CPU时间在对于这种矩阵的求逆上(利用我们上面给出的通用公式),因为其特殊形式我们有办法提前确定矩阵逆的形式。

矩阵的逆的性质

(AB)1=B1A1


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 XMMATRIX
inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource);
//store data from XMMATRIX into XMFLOAT4X4
inline void XM_CALLCONV XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIXM);

一些有用的函数:

XMMATRIX XM_CALLCONV XMMatrixIdentity();//返回单位矩阵I
bool 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一样的规则,就不在重复啦。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值