1.矩陣及其運(yùn)算
矩陣的運(yùn)算:①加②減③標(biāo)量乘法
④矩陣乘法:
矩陣乘法要有意義的條件是矩陣A的列數(shù)和矩陣B的行數(shù)必須相同,所以一般不滿足交換律
⑤轉(zhuǎn)置矩陣:
⑥矩陣行列式:det A
學(xué)習(xí)行列式的主要目的是:利用它推導(dǎo)出求逆矩陣的公式
方陣A是可逆的,當(dāng)且僅當(dāng)det A ≠ 0
余子陣:去除第i行和第j行得到的(n-1)*(n-1)矩陣0
矩陣的行列式是一種遞歸定義,detA的A當(dāng)是二維方陣時(shí),行列式的值就是
元素Aij的代數(shù)余子陣:
? ?如果為矩陣A中每個(gè)元素分別計(jì)算出Cij,并將其置于矩陣中第i行、第j列的相應(yīng)位置,那么將獲得矩陣A的代數(shù)余子式矩陣
伴隨矩陣:? 代數(shù)余子陣的轉(zhuǎn)置
⑦逆矩陣:
可逆矩陣的逆矩陣是唯一的?
矩陣不存在除法的概念,但提供逆矩陣可以求解某些方程:比如?求解p
2.用DirectXMath庫(kù)處理矩陣:
XMMATRIX : 由4個(gè)XMVECTOR組成,借此使用SIMD技術(shù) --? 4x4的矩陣
// XMMATRIX類表示4×4矩陣
// 內(nèi)部用r來(lái)存儲(chǔ)4個(gè)行向量
XMVECTOR r[4];
// 構(gòu)造方法:
// 4個(gè)行向量
XMVECTOR(FXMVECTOR R0,FXMVECTOR R1,FXMVECTOR R2,CXMVECTOR R3);
// 16個(gè)浮點(diǎn)數(shù)
XMMATRIX(float m00,float m01,...);
// 16個(gè)浮點(diǎn)數(shù)元素?cái)?shù)組
explicit XMMATRIX(_in_reads_(16) const float *pArray);
// 拷貝構(gòu)造函數(shù)
XMMATRIX& operator=(const XMMATRIX& M);
XMMATRIX運(yùn)算:
1.兩個(gè)XMMATRIX矩陣:
+ - += -=
* *=
2.XMMATRIX和浮點(diǎn)數(shù):
/ * /= *=
XMMATRIX創(chuàng)建實(shí)例的其他方法:
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來(lái)存儲(chǔ)類中的矩陣類型數(shù)據(jù)成員:
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個(gè)浮點(diǎn)數(shù)2.浮點(diǎn)數(shù)數(shù)組
// 還可以指定(行數(shù),列數(shù)),或=從另一個(gè)實(shí)例復(fù)制
float operator() (size_t Row, size_t Column)const{return m[Row][Column];}
};
①加載方法:
inline XMMATRIX XM_CALLCONV XMLoadFloat4x4(const XMFLOAT4X4* pSource);
②存儲(chǔ)方法:
inline void XM_CALLCONV XMStoreFloat4x4(XMFLOAT4X4* pDestination, FXMMATRIX M);
矩陣函數(shù):直接用于創(chuàng)建特定矩陣
// 返回單位矩陣I
XMMatrixIdentity()
// bool 判斷是否為單位矩陣
XMMatrixIsIdentity(FXMMATRIX M);
// 返回乘積AB
XMMatrixMultiply(FXMMATRIX A,CXMMATRIX B);
// 返回轉(zhuǎn)置矩陣
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);
假設(shè)傳入函數(shù)的XMVECTOR參數(shù)不超過(guò)兩個(gè),則第一個(gè)XMMATRIX參數(shù)應(yīng)當(dāng)為FXMMATRIX類型,其余的XMMATRIX參數(shù)均應(yīng)當(dāng)為CXMMATRIX類型
在32位Windows操作系統(tǒng)上的__fastcall調(diào)用約定中,XMMATRIX類型的參數(shù)是不能傳至SSE/SSE2寄存器的,因?yàn)檫@些寄存器只支持3個(gè)XMVECTOR參數(shù)傳入(XMMATRIX視為4個(gè)XMVECTOR),所以只能通過(guò)堆棧來(lái)加以引用?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-501235.html
// 32位 typedef const XMMATRIX& FXMMATRIX; typedef const XMMATRIX& CXMMATRIX; // 64位 typedef const XMMATRIX FXMMATRIX; typedef const XMMATRIX& CXMMATRIX;
代碼示例:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-501235.html
#include <windows.h> // XMVerifyCPUSupport()函數(shù)
#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;
// 也可以通過(guò)cout遍歷打印FXMMATRIX的XMVECTOR數(shù)組成員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;
}
到了這里,關(guān)于dx12 龍書第二章學(xué)習(xí)筆記 -- 矩陣代數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!