[C++]学习《DirectX12 3D 游戏开发实战》 第二天 矩阵代数

本文详细介绍了如何在C++中使用DirectXMath库进行矩阵运算,包括XMMATRIX类的使用、矩阵乘法、转置、行列式、逆矩阵等基本操作,并提供了矩阵运算的公式总结。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DirectXMath矩阵示例程序
1. XMMATRIX类使用范例
#include <windows.h> // 为了使 XMVerifyCPUSupport 函数返回正确值
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
#include <iostream>
using namespace std;
using namespace DirectX;
using namespace DirectX::PackedVector;

// 重载“<<”运算符,这样就可以利用cout输出 XMVECTOR 和 XMMATRIX 对象
ostream& XM_CALLCONV operator << (ostream& os, FXMVECTOR v)
{
    XMFLOAT4 dest; // 4D向量
    XMStoreFloat4(&dest, v); // 将数据从 XMVECTOR 类型存储到 XMFLOAT4 类型

    os << "(" << dest.x << ", " << dest.y << ", " << dest.z << ", " << dest.w << ")";
    return os;
}

ostream& XM_CALLCONV operator << (ostream& os, FXMMATRIX m)
{
    for (int i = 0; i < 4; ++i)
    {
        os << XMVectorGetX(m.r[i]) << "\t"; 
        os << XMVectorGetY(m.r[i]) << "\t";
        os << XMVectorGetZ(m.r[i]) << "\t";
        os << XMVectorGetW(m.r[i]);
        os << endl;
    }
    return os;
}

int main()
{
    // 检查是否支持SSE2指令集
    if (!XMVerifyCPUSupport())
    {
        cout << "directx math not supported" << endl;
        return 0;
    }

    XMMATRIX A(1.0f, 0.0f, 0.0f, 0.0f,
        0.0f, 2.0f, 0.0f, 0.0f,
        0.0f, 0.0f, 4.0f, 0.0f,
        1.0f, 2.0f, 3.0f, 1.0f); // 设置矩阵

    XMMATRIX B = XMMatrixIdentity(); // 返回单位矩阵 I

    bool isIdentity = XMMatrixIsIdentity(B); // 判断矩阵是单位矩阵

    XMMATRIX C = A * B; // 矩阵乘法

    XMMATRIX C1 = XMMatrixMultiply(A, B); // 矩阵乘法

    XMMATRIX D = XMMatrixTranspose(A); //转置矩阵

    XMVECTOR det = XMMatrixDeterminant(A); // 行列式
    XMMATRIX E = XMMatrixInverse(&det, A); // 逆矩阵

    XMMATRIX F = A * E;

    cout << "A = " << endl << A << endl;
    cout << "B = " << endl << B << endl;
    cout << "C = A*B = " << endl << C << endl;
    cout << "C1 = A multiply B = " << endl << C1 << endl;
    cout << "D = transpose(A) = " << endl << D << endl;
    cout << "det = determinant(A) = " << det << endl << endl;
    cout << "E = inverse(A) = " << endl << E << endl;
    cout << "F = A*E = " << endl << F << endl;
    cout << "B 是单位矩阵?" << isIdentity << endl;

    return 0;
}

运行结果:

2. 矩阵运算公式个人总结
2.1 矩阵乘法

A=[a_{ij}]是m×n矩阵,B=[b_{ij}]是n×s矩阵

\begin{bmatrix} ... & ...& ...& ...\\ a_{i1}& a_{i2}& ...& a_{in}\\ ...& ...& ...& ... \end{bmatrix}\begin{bmatrix} ... & b_{1j}& ...\\ ...& b_{2j}& ...\\ ...& ...& ...\\ ...& b_{nj}& ... \end{bmatrix}=\begin{bmatrix} & ...& \\ ...& c_{ij} & ...\\ & ... & \end{bmatrix}

            m×n                           n×s                          m×s

2.2 转置矩阵

A=\begin{bmatrix} 1 & 2& 3\\ 4& 5& 6 \end{bmatrix},则A^{T}=\begin{bmatrix} 1 & 4\\ 2 & 5\\ 3 & 6 \end{bmatrix}

2.3 余子式

A=\begin{bmatrix} a& b& c\\ d& e& f\\ g& h& i \end{bmatrix},则A(e) = A_{22}=\begin{bmatrix} a & c\\ g&i \end{bmatrix}=a*i-c*g

2.4 代数余子式

C_{ij}=(-1)^{i+j}*A_{ij}

2.5 行列式

detA=|A|=a_{i1}C_{i1}+a_{i2}C_{i2}+...+a_{in}C_{in}(i=1,2,...,n)

2.6 伴随矩阵

A^{*}=\begin{bmatrix} A_{11} & A_{21} & ... &A_{n1} \\ A_{12}& A_{22}& ...&A_{n2} \\ ...& ...& & ...\\ A_{1n}& A_{2n} & ...& A_{nn} \end{bmatrix}

2.7 逆矩阵

AB=BA=I

2.8 相关运算公式
2.8.1 转置

(A^{T})^{T}=A

(A+B)^{T}=A^{T}+B^{T}(kA)^{T}=kA^{T}

(AB)^{T}=B^{T}A^{T}

2.8.2 逆

(A^{-1})^{-1}=A

(kA)^{-1}=\frac{1}{k}A^{-1}(k\neq 0)

(AB)^{-1}=B^{-1}A^{-1}

(A^{n})^{-1}=(A^{-1})^{n}

(A^{-1})^{T}=(A^{T})^{-1}

|A^{-1}|=\frac{1}{|A|}

A^{-1}=\frac{1}{|A|}A^{*}

2.8.3 伴随

AA^{*}=A^{*}A=|A|I

A^{*}=|A|A^{-1}

|A^*|=|A|^{n-1}

(A^*)^{-1}=(A^{-1})^*=\frac{1}{|A|}A

(A^*)^T=(A^T)^*

(kA)^*=k^{n-1}A^*

(A^*)^*=|A|^{n-2}A

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值