dx12 龙书第二章学习笔记 -- 矩阵代数

这篇具有很好参考价值的文章主要介绍了dx12 龙书第二章学习笔记 -- 矩阵代数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.矩阵及其运算

矩阵的运算:①加②减③标量乘法

④矩阵乘法:

矩阵乘法要有意义的条件是矩阵A的列数和矩阵B的行数必须相同,所以一般不满足交换律

dx12 龙书第二章学习笔记 -- 矩阵代数

⑤转置矩阵:

dx12 龙书第二章学习笔记 -- 矩阵代数

⑥矩阵行列式:det A

学习行列式的主要目的是:利用它推导出求逆矩阵的公式

方阵A是可逆的,当且仅当det A ≠ 0

余子阵:去除第i行和第j行得到的(n-1)*(n-1)矩阵0

dx12 龙书第二章学习笔记 -- 矩阵代数

矩阵的行列式是一种递归定义,detA的A当是二维方阵时,行列式的值就是

元素Aij的代数余子阵:

dx12 龙书第二章学习笔记 -- 矩阵代数   如果为矩阵A中每个元素分别计算出Cij,并将其置于矩阵中第i行、第j列的相应位置,那么将获得矩阵A的代数余子式矩阵

伴随矩阵:  代数余子阵的转置

⑦逆矩阵:

可逆矩阵的逆矩阵是唯一的 

矩阵不存在除法的概念,但提供逆矩阵可以求解某些方程:比如 求解p

2.用DirectXMath库处理矩阵:

XMMATRIX : 由4个XMVECTOR组成,借此使用SIMD技术 --  4x4的矩阵

// XMMATRIX类表示4×4矩阵

// 内部用r来存储4个行向量
XMVECTOR r[4]; 

// 构造方法:
// 4个行向量
XMVECTOR(FXMVECTOR R0,FXMVECTOR R1,FXMVECTOR R2,CXMVECTOR R3); 

// 16个浮点数
XMMATRIX(float m00,float m01,...); 

// 16个浮点数元素数组
explicit XMMATRIX(_in_reads_(16) const float *pArray); 

// 拷贝构造函数
XMMATRIX& operator=(const XMMATRIX& M);

XMMATRIX运算:

1.两个XMMATRIX矩阵:

+ - += -=

* *=

2.XMMATRIX和浮点数:

/ * /= *=

XMMATRIX创建实例的其他方法:

XMMATRIX XM_CALLCONV XMMatrixSet(
    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,    
);

DirectXMath文档也建议我们用XMFLOAT4X4来存储类中的矩阵类型数据成员:

struct XMFLOAT4X4{
	union{
		struct{
			float _11,_12,_13,_14;
			float _21,_22,_23,_24;
			float _31,_32,_33,_34;
			float _41,_42,_43,_44;
		};
	};
	float m[4][4];
    // 初始化方式和XMMATRIX类似 -- 1.16个浮点数2.浮点数数组
    // 还可以指定(行数,列数),或=从另一个实例复制
    float operator() (size_t Row, size_t Column)const{return m[Row][Column];}
};

①加载方法:

inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource);

②存储方法:

inline void XM_CALLCONV XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIX M);

矩阵函数:直接用于创建特定矩阵

// 返回单位矩阵I
XMMatrixIdentity() 

// bool 判断是否为单位矩阵
XMMatrixIsIdentity(FXMMATRIX M); 

// 返回乘积AB
XMMatrixMultiply(FXMMATRIX A,CXMMATRIX B); 

// 返回转置矩阵
XMMatrixTranspose(FXMMATRIX M); 

// 返回(det M,det M,det M,det M) -- XMVECTOR类型
XMMatrixDeterminant(FXMMATRIX M); 

// 输入:pDeterminant是(det M,det M,det M,det M) 返回M的逆矩阵
XMMatrixInverse(XMVECTOR* pDeterminant, FXMMATRIX M); 

假设传入函数的XMVECTOR参数不超过两个,则第一个XMMATRIX参数应当为FXMMATRIX类型,其余的XMMATRIX参数均应当为CXMMATRIX类型

在32位Windows操作系统上的__fastcall调用约定中,XMMATRIX类型的参数是不能传至SSE/SSE2寄存器的,因为这些寄存器只支持3个XMVECTOR参数传入(XMMATRIX视为4个XMVECTOR),所以只能通过堆栈来加以引用 

// 32位
typedef const XMMATRIX& FXMMATRIX;
typedef const XMMATRIX& CXMMATRIX;

// 64位
typedef const XMMATRIX FXMMATRIX;
typedef const XMMATRIX& CXMMATRIX;

代码示例:文章来源地址https://www.toymoban.com/news/detail-501235.html

#include <windows.h> // XMVerifyCPUSupport()函数
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
#include <iostream>
using namespace DirectX;
using namespace DirectX::PackedVector;
using namespace std;

ostream& XM_CALLCONV operator<<(ostream& os, FXMMATRIX m)
{
	XMFLOAT4X4 dest;
	XMStoreFloat4x4(&dest, m);

	for (int i = 0; i < 4; i++) {
		for (int j = 0; j < 4; j++) {
			os << dest.m[i][j] << " ";
		}
		os << "\n";
	}
	return os;
	// 也可以通过cout遍历打印FXMMATRIX的XMVECTOR数组成员r
}

int main()
{
	cout.setf(ios_base::boolalpha);

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

	XMMATRIX m1 = XMMatrixIdentity();
	cout << m1 << endl;

	XMMATRIX m2 = XMMatrixSet(
		1.f, 0.f, 0.f, 0.f,
		0.f, 2.f, 0.f, 0.f,
		0.f, 0.f, 4.f, 0.f,
		1.f, 2.f, 3.f, 1.f
	);
	cout << m2 << endl;

	XMMATRIX m3 = XMMatrixTranspose(m2);
	cout << m3 << endl;

	cout << m2 * m3 << endl;
	cout << 2 * m1 << endl;
	cout << m3 - m2 << endl;

	XMVECTOR v = XMMatrixDeterminant(m2);
	XMMATRIX m4 = XMMatrixInverse(&v, m2);
	cout << m4 << endl;
	
}

到了这里,关于dx12 龙书第二章学习笔记 -- 矩阵代数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Windows高级调试(学习笔记)-第二章-调试器介绍

    2.1.1 Debugger Types调试器类型 User Mode Deduggers(用户态调试器) 实时调试(Living Debugging)、事后调试(Postmortem Debugging) 三个用户态调试器:cdb.exe、nstd.exe及windbg.exe Kernel Mode Debugger(内核态调试器) 可以分析计算机系统 二个内核态调试器:kd.exe及windbg.exe 2.1.2 Debugger Commands调试器命令 buil

    2024年01月18日
    浏览(53)
  • Rx.NET in Action 第二章学习笔记

    本章节涵盖的内容: 不使用Rx的工作方式 向项目中添加Rx 创建你的第一个Rx应用程序 Rx 的目标是协调和统筹来自社交网络、传感器、用户界面事件等不同来源的基于事件的异步计算。例如,建筑物周围的监控摄像头和移动传感器会在有人靠近建筑物时触发,并从最近的摄像头

    2024年02月12日
    浏览(26)
  • 《MetaGPT智能体开发入门》学习笔记 第一章第二章

    使用从 - 通过github仓库获取MetaGPT 代码拉下来后在config文件夹中配置chatGPT key 使用的python环境为3.9.2 metaGPT代码下载后在metagpt文件夹中找statup.py文件,运行以下命令,我是没有成功可能是chatgpt没钱 智能体 = LLM+观察+思考+行动+记忆 多智能体 = 智能体+环境+SOP+评审+路由+订阅+经

    2024年01月17日
    浏览(46)
  • Django学习笔记:第二章django的安装和创建应用

    终端运行 查看django是否安装成功 在控制台运行 在特定文件夹内打开终端运行 生成 进入上图的Scripts文件夹内,打开终端 先正常安装VSCode 再安装python插件 安装Django插件,搜索django,安装前两个 特点 功能完善,开发速度快,安全性强 有完善的在线文档 模型自带数据库ORM组件

    2024年02月16日
    浏览(37)
  • 【UnityShader入门精要学习笔记】第二章(2)GPU流水线

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 在上节笔记中,我们学习了图像渲染流水线的基本过程,从应用

    2024年02月22日
    浏览(33)
  • 【UnityShader入门精要学习笔记】第二章(1)了解渲染流水线

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 什么是流水线?书中举了一个生产洋娃娃的例子。一个洋娃娃的

    2024年01月25日
    浏览(32)
  • 《EDA技术实用教程(第六版(黄继业, 潘松))》学习笔记——第二章

    PLD(Programmable Logic Device):可编程逻辑器件 RAM(Random Access Memory):随机访问存储器 DRAM(Dynamic Random Access Memory):动态随机访问存储器 SRAM(Static Random Access Memory):静态随机访问存储器 ROM(Read-Only Memory):只读存储器 PROM(Programmable Read-Only Memory):可编程只读存储器

    2024年01月18日
    浏览(34)
  • Linux高性能服务器编程 学习笔记 第二章 IP协议详解

    本章从两方面探讨IP协议: 1.IP头部信息。IP头部出现在每个IP数据报中,用于指定IP通信的源端IP地址、目的端IP地址,指导IP分片和重组,指定部分通信行为。 2.IP数据报的路由和转发。IP数据报的路由和转发发生在除目标机器外的所有主机和路由器上,它们决定数据报是否应

    2024年02月09日
    浏览(28)
  • 《Flink学习笔记》——第二章 Flink的安装和启动、以及应用开发和提交

    ​ 介绍Flink的安装、启动以及如何进行Flink程序的开发,如何运行部署Flink程序等 2.1 Flink的安装和启动 本地安装指的是单机模式 0、前期准备 java8或者java11(官方推荐11) 下载Flink安装包 https://flink.apache.org/zh/downloads/ hadoop(后面Flink on Yarn部署模式需要) 服务器(我是使用虚拟

    2024年02月10日
    浏览(28)
  • 【操作系统OS】学习笔记:第二章 进程与线程 (上)【哈工大李治军老师】

    基于本人观看学习 哈工大李治军老师主讲的操作系统课程 所做的笔记,仅进行交流分享 特此鸣谢李治军老师,操作系统的神作! 如果本篇笔记帮助到了你,还请点赞 关注 支持一下 ♡𖥦)!! 主页专栏有更多,如有疑问欢迎大家指正讨论,共同进步! 给大家跳段街舞感谢支持

    2024年02月02日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包