矩阵代数

学习目标

  1. 理解矩阵及其相关运算的定义
  2. 探究为何能把向量和矩阵的乘法视为一种线性组合
  3. 学习单位矩阵、转置矩阵、行列式以及矩阵的逆等概念
  4. 逐步熟悉DirectXMath库中提供的关于矩阵计算的类与函数的子集

2.1矩阵的定义

一个规模为m x n的矩阵,是由m行n列实数构成的矩阵阵列,行数和列数的乘积表示了矩阵的维度,矩阵中的数字则称为元素或元。理解矩阵相等、加法运算,标量乘法和减法运算。

2.2矩阵乘法

如果A是一个m x n矩阵,B是一个n x p矩阵,那么AB的乘积是一个规模为m x p的矩阵C,矩阵C中第i行、第j列的元素,有矩阵A的第i个行向量与矩阵B的第j个列向量的点积求得。要注意的是,矩阵A的行向量的维数(可认为是分量的个数)必须和矩阵B的列向量的维数相等才可以使矩阵乘积AB有意义。而且矩阵乘积一般不满足交换律

2.2.2向量和矩阵的乘法

向量与矩阵的乘积uA相当于:向量u给定的标量系数(x,y,z)与矩阵A中各行向量的线性组合。这个结论有一个一般性,对于一个1 x n行向量u和一个n x m矩阵A的乘积为:u1A1 + u2A2 + …… unAn

2.2.3结合律

矩阵乘法对矩阵加法的分配律:A(B + C) = AB + AC和(A + B)C = AC + BC。

矩阵乘法结合律:(AB)C = A(BC)

2.3转置矩阵

转置矩阵指的是将原矩阵的行与列进行互换所得到的新矩阵,转置矩阵具有一些性质,这里不列举

2.4单位矩阵

单位矩阵I是一种主对角线的元素均为1,其他元素都为0的方阵。单位矩阵是矩阵的乘法单位元,即任何矩阵和单位矩阵相乘,得到的原矩阵,如果M是一个方阵M,则MI = IM,满足乘法交换律

2.5矩阵的行列式

行列式是一种特殊的函数,它以一个方阵作为输入,并输出一个实数,方阵A的行列式通常表示为det A。行列式推导出求逆矩阵的公示,此外,行列式也可以用来证明:方阵A是可逆的,当且仅当det A 不为0。

2.5.1余子阵

指定一个n x n的矩阵,余子阵Aij(A上有一横线)即从A中取出第i行和第j列的(n - 1) x (n - 2)矩阵

2.5.2行列式的定义

2.6伴随矩阵

2.7逆矩阵

2.8用DirectXMath库处理矩阵

为了对点和向量进行变换,我们要借助1 x 4行向量以及4 x 4矩阵

2.8.1矩阵类型

DirectXMath库用定义在DirectXMath.h头文件中的XMMATRIX类来表示4 x 4矩阵,XMMATRIX由4个XMVECTOR实例构成,借此来使用SIMD技术。XMMATRIX类为矩阵运算提供了多种重载运算符。除了各种构造方法之外,我们还可以使用XMMatrixSet函数来创建XMMATRIX实例。

和XMVECTOR一样,我们建议用XMFLOAT4X4来存储类中的矩阵类型数据成员,而不是直接使用XMMATRIX.

我们可以用加载方法和存储方法来实现XMMATRIX和XMFLOAT4X4类型之间的相互转换

加载方法:

XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource)

存储方法:

void XM_CALLCONV  XMStoreFloat4x4(XMFloat4x4 * pDestination,FXMMATRIX M)

2.8.2矩阵函数

DirectXMath库包含了一些和矩阵相关的函数

//返回单位矩阵
XMMATRIX XM_CALLCONV XMMatrixIdentity();
//如果M是单位矩阵则返回true
bool XM_CALLCONV XMMatrixIsIdentity(FXMMATRXI M);
//返回矩阵乘积AB
XMMATRIX XM_CALLCONV XMMatrixMultiply(FXMMATRIX A,CXMMATRIX B);
//返回矩阵M的转置
XMMATRIX XM_CALLCONVE XMMatrixTranspose(FXMMATRIX M);
//返回(det M,det M,det M,det M,)
XMVECTOR XM_CALLCONV XMMatrixDeteminant(FXMMATRIX M);
//返回矩阵M的逆矩阵
XMMATRIX XM_CALLCONV XMMatrixInverse(XMVECTOR* pDeteminant,FXMMATRIX M);

在声明具有XMMATRIX参数的函数时,除了要注意一个XMMATRIX类型相当于4个XMVECTOR类型之外,还要注意,第一个参数应该为FXMMATRIX类型,其余都应该为CXMMATRIX类型。不过有一个特例,在构造函数中的参数应该都使用CXMMATRIX类型,而且对于构造函数,也不能使用XM_CALLCONV约定注解

2.8.3DirectXMath矩阵实例程序

主要是一些XMMATRIX类的使用范例,如果想要看示例代码可以自行百度,以后可能会更新。

DirectX12 3D 游戏开发与实战第二章内容的更多相关文章

  1. DirectX12 3D 游戏开发与实战第九章内容(上)

    仅供个人学习使用,请勿转载. 9.纹理贴图 学习目标: 学习如何将局部纹理映射到网格三角形上 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次纹理贴图 ...

  2. DirectX12 3D 游戏开发与实战第一章内容

    DirectX12 3D 第一章内容 学习目标 1.学习向量在几何学和数学中的表示方法 2.了解向量的运算定义以及它在几何学中的应用 3.熟悉DirectXMath库中与向量有关的类和方法 1.1 向 ...

  3. DirectX12 3D 游戏开发与实战第九章内容(下)

    仅供个人学习使用,请勿转载.谢谢! 9.纹理贴图 学习目标 学习如何将局部纹理映射到网格三角形中 探究如何创建和启用纹理 学会如何通过纹理过滤来创建更加平滑的图像 探索如何使用寻址模式来进行多次贴图 ...

  4. DirectX12 3D 游戏开发与实战第八章内容(下)

    DirectX12 3D 游戏开发与实战第八章内容(下) 8.9.材质的实现 下面是材质结构体的部分代码: // 简单的结构体来表示我们所演示的材料 struct Material { // 材质唯一 ...

  5. DirectX12 3D 游戏开发与实战第八章内容(上)

    8.光照 学习目标 对光照和材质的交互有基本的了解 了解局部光照和全局光照的区别 探究如何用数学来描述位于物体表面上某一点的"朝向",以此来确定入射光照射到表面的角度 学习如何正确 ...

  6. DirectX12 3D 游戏开发与实战第十章内容(下)

    仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...

  7. DirectX12 3D 游戏开发与实战第十章内容(上)

    仅供个人学习使用,请勿转载.谢谢! 10.混合 本章将研究混合技术,混合技术可以让我们将当前需要光栅化的像素(也称为源像素)和之前已经光栅化到后台缓冲区的像素(也称为目标像素)进行融合.因此,该技术可 ...

  8. DirectX12 3D 游戏开发与实战第五章内容

    渲染流水线 学习目标: 了解用于在2D图像中表现出场景立体感和空间深度感等真实效果的关键因素 探索如何用Direct3D表示3D对象 学习如何建立虚拟摄像机 理解渲染流水线,根据给定的3D场景的几何描 ...

  9. DirectX12 3D 游戏开发与实战第四章内容(上)

    Direct3D的初始化(上) 学习目标 了解Direct3D在3D编程中相对于硬件所扮演的角色 理解组件对象模型COM在Direct3D中的作用 掌握基础的图像学概念,例如2D图像的存储方式,页面翻 ...

随机推荐

  1. monkey学习总结笔记

    一.什么是monkey? Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输入.手势输入等),实现对正在开发的应用程序 ...

  2. 从零写一个编译器(十三):代码生成之遍历AST

    项目的完整代码在 C2j-Compiler 前言 在上一篇完成对JVM指令的生成,下面就可以真正进入代码生成部分了.通常现代编译器都是先把生成IR,再经过代码优化等等,最后才编译成目标平台代码.但是时 ...

  3. 关于selenium自动化对iframe内嵌元素的处理

    今天上班闲来无聊,于是来练练自动化,结果碰上了可恶的iframe,楼主,以前也遇到过,但是一直也没搞懂怎么处理的,都是抄别人的代码,今天决定独立解决试试.首先先来认识什么是iframe,它就长下图这样 ...

  4. pycharm编辑器简单配置-- 持续更新完善

    目录 python解释器安装.多版本共存等 给pycharm编辑器选择python解释器版本 配置pip仓库地址 方式一:直接修改文件配置 方式二:pycharm配置 方式三:通过临时指定pip仓库地 ...

  5. 七缸发动机预热,docker swarm + .net core 高速飙车成功

    (图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...

  6. Linux 防火墙开放、查询、关闭端口

    1. 开放指定端口 firewall-cmd --zone=public --add-port=5121/tcp --permanent # --permanent 永久生效,如果不加此条,重启后该命 ...

  7. .Net Core 2.2与Java 12性能对比

    我发现基准游戏(https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/csharp.html)是一套非常好的基准测试. ...

  8. (数据科学学习手札69)详解pandas中的map、apply、applymap、groupby、agg

    *从本篇开始所有文章的数据和代码都已上传至我的github仓库:https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 pandas提供了很多方 ...

  9. React 路由&脚手架

    1.创建react项目 npm install -g create-react-app 全局环境 create-react-app my-app 创建项目 cd my-app 进入项目 npm sta ...

  10. Solr7.0搭建过程

    小李经过Elasticsearch和solr之我为什么选择solr之后决定使用使用Solr作为项目的搜索引擎,然后和同事们开始讨论细节问题. 小李:虽然我会solr4.7版本的搭建,但是人总要有点梦想 ...