DirectX10一矩阵代数(二)

来源:互联网 发布:国税数据质量监控 编辑:程序博客网 时间:2024/05/14 08:08

一.矩阵基本概念

DirectX10中,矩阵是一个非常重要的概念,这里我们主要探讨以下几个方面:

1.矩阵乘法

         假设A是一个m*n矩阵,B是一个n*p的矩阵,若C = A* B,则C是一个m*p矩阵,其中C的每一个元素Ci,j = Ai,* * B*,j

2.向量-矩阵乘法

          假设向量u=(x,y,z),矩阵A = [A*,1,A*,2,A*,3],则向量u与矩阵A相乘的结果为uA = xA*,1 + yA*,2 + zA*,3,这说明向量-矩阵的乘积uA等于向量的标量系数与矩阵A的行向量的线性组合。

注意:矩阵乘法满足交换律,即A(BC) = ABC

3.矩阵转置

          对一个矩阵M的行列进行互换,即可得到该矩阵的转置(transpose)矩阵,记作MT.

4.单位矩阵

         单位矩阵(identitymatrix)是一个正方形矩阵,其除了对角线上的元素为1外,其余都为0.

注意:单位矩阵的作用相当于一个乘法单位,也就是,如果A是一个m*n矩阵,B是一个n*p矩阵,In*n单位矩阵,那么,AI=AIB = B

5.逆矩阵

矩阵运算中没有除法运算,但是却定义了一种逆(inverse)运算.

注意:

1.只有正方形矩阵有逆运算

2.逆矩阵记作M-1

3.并不是所有的正方形矩阵都有逆矩阵,有逆矩阵的正方形矩阵称为可逆矩阵,没有逆矩阵的正方形矩阵称为单调矩阵

4.逆矩阵若存在,必定唯一

5.矩阵与其逆矩阵相乘必为单位矩阵

6.(AB)-1  =  B-1 * A-1

二.D3DX中的矩阵

1.基本类与函数

D3DX中,我们主要使用D3DXMATRIX类表示4*4矩阵,其在D3DX中的定义如下:

typedef struct D3DXMATRIX: public D3DMATRIX{public D3DXMATRIX(){};public D3DXMATRIX(CONST  FLOAT*);public D3DXMATRIX(CONST D3DMATRIX&);public D3DXMATRIX(CONST D3DXFLOAT16 *);public D3DXMATRIX(FLOAT _11,FLOAT _12,FLOAT _13,FLOAT _14,FLOAT _21,FLOAT _22,FLOAT _23,FLOAT _24,FLOAT _31,FLOAT _32,FLOAT _33,FLOAT _34,FLOAT _41,FLOAT _42,FLOAT _43,FLOAT _44,);FLOAT & operator(UINT row,UINT col) ;FLOAT operator(UINT row,UINT col) const; operator FLOAT*();operator  CONST FLOAT*() const;  D3DXMATRIX& operator *= (CONST D3DXMATRIX&);D3DXMATRIX& operator += (CONST D3DXMATRIX&);D3DXMATRIX& operator -= (CONST D3DXMATRIX&);D3DXMATRIX& operator *= (FLOAT);D3DXMATRIX& operator /=(FLOAT);  D3DXMATRIX operator + () const;D3DXMATRIX operator - () const; D3DXMATRIX operator *(CONST D3DXMATRIX&) const;D3DXMATRIX operator +(CONST D3DXMATRIX&) const;D3DXMATRIX operator -(CONST D3DXMATRIX&) const;D3DXMATRIX operator * (FLOAT) const;D3DXMATRIX operator / (FLOAT) const; friend  D3DXMATRIX operator *(FLOAT,CONST D3DXMATRIX &);bool operator ==(CONST D3DXMATRIX&) CONST;bool operator !=(CONST D3DXMATRIX&) CONST;}D3DXMATRIX,*LPD3DXMATRIX;


          除了上述定义之外,D3DX库还定义了许多实用函数,分别用于获取4 x 4单位矩阵,计算转置矩阵,计算逆矩阵,以及几种不同维数的向量矩阵乘法。

分别如下:

D3DXMATRIX  *D3DXMatrixIdentity(D3DXMATRIX *pOut;// 获取单位矩阵);D3DXMATRIX *D3DXMatrixTranspose(D3DXMATRIX *pOut;//输出 MTCONST D3DXMATRIX *pM;//输入M,);D3DXMATRIX *D3DXMatrixInverse(D3DXMATRIX *pOut;//输出M-1FLOAT * pDeterminent;//通常为0CONST D3DXMATRIX *pM;//输入M);D3DXVECTOR4 *D3DXVec4Transform(D3DXVECTOR4 *pOut;//输出 V*MCONST D3DXVECTOR4 *pV;//输入 VCONST D3DXMATRIX *pM;// 输入 M);


2.程序演示

注意:程序中的一些配置不再赘述,可参考

#include<D3D10.h>#include<iostream>#include<D3DX10math.h>using namespace  std; ostream& operator<<(ostream& os,D3DXVECTOR4& v){os<<"{"<<v.x<<","<<v.y<<","<<v.z<<","<<v.w<<"}";return os;} ostream& operator<<(ostream& os,D3DXMATRIX& m){for (int i=0;i<4;++i){for (int j=0;j<4;++j){os<<m(i,j)<<" ";}os<<endl;}return os;}  int main(){ D3DXMATRIX A(1.0f,0,0,0,0,2.0f,0,0,0,0,4.0f,0,1.0f,2.0f,3.0f,1.0f);D3DXMATRIX B; D3DXMatrixIdentity(&B);//求ó单蹋?位?矩?阵ó D3DXMATRIX C = A*B;//矩?阵ó乘?法ぁ? D3DXMATRIX D,E,F; D3DXMatrixTranspose(&D,&A);//矩?阵ó转羇置? D3DXMatrixInverse(&E,0,&A);//逆?矩?阵ó F = A * E;//向ò量?*矩?阵ó D3DXVECTOR4 P(2.0f,2.0f,2.0f,1.0f);D3DXVECTOR4 Q(2.0f,2.0f,2.0f,0.0f);D3DXVECTOR4 R,S; D3DXVec4Transform(&R,&P,&A);//R = P * AD3DXVec4Transform(&S,&Q,&A);//S = Q * A ////////////////////////////////////////////////////////////////////////// cout<<"A = "<<endl<<A<<endl;cout<<"B = "<<endl<<B<<endl;cout<<"C =  A*B = "<<endl<<C<<endl;cout<<"D =  transpose(A) = "<<endl<<D<<endl;cout<<"E =  inverse(A) = "<<endl<<E<<endl;cout<<"F =  A*E = "<<endl<<F<<endl;cout<<"P = "<<P<<endl;cout<<"Q = "<<Q<<endl;cout<<"R = P*A = "<<R<<endl;cout<<"S = Q*A = "<<S<<endl; system("pause");return 0;}


程序结果:



0 0