www.pudn.com > DLT.rar > Matrix.h, change:2008-03-21,size:14229b


// Matrix.h: interface for the CMatrix class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#if !defined(AFX_MATRIX_H__FF0DD7B1_E190_48F1_A1B2_5D5E7D69CA46__INCLUDED_) 
#define AFX_MATRIX_H__FF0DD7B1_E190_48F1_A1B2_5D5E7D69CA46__INCLUDED_ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
typedef unsigned char       uint1; //标识用u1,数值运算 
typedef unsigned short      uint2; //标识用u2,数值运算 
typedef unsigned long       uint4; //标识用u4,数值运算 
typedef char		         int1;  //标识用i1,数值运算 
typedef short		         int2;  //标识用i2,数值运算 
typedef int		             int4;  //标识用i4,数值运算 
typedef float		           f4;  //标识用f4,数值运算 
typedef double		           f8;  //标识用f8,数值运算 
//typedef char					BOOL   //标识用b, 逻辑运算(由于WINDOWS操作系统在afx.h中有此定义,所以此处不需) 
/* 
	固定长度字符串用int1[],标识用str 
	不定长度字符串:WINDOWS环境中使用CString,其他环境中使用int1*,标识均为str 
*/ 
 
/////////////////////////////////////////// 
//标准常量 
#undef FALSE 
#define FALSE   0 
#undef TRUE 
#define TRUE    1 
#undef NULL 
#define NULL    0 
 
 
/////////////////////////////////////////// 
//数学常量及变换 
#define PI               (3.141592653589793) 
#define DEG2SEMI         (1.0/180.0)			 //degees to semisircles 
#define SEMI2RAD         (PI)				     //semisircles to radians 
#define DEG2RAD          (PI/180.0)			     //degrees to radians 
#define SEC2RAD          (PI/180.0/3600.0)		 //seconds to radians 
#define RAD2DEG          (180.0/PI)			     //radians to degrees 
#define RAD2SEC          (3600.0*180.0/PI)       //radians to seconds 
#define EPSILON          (1e-10)				 //minimax float value can be ignored 
 
class CMatrix   
{ 
public: 
	CMatrix(); 
	//复制构造 
	CMatrix(const CMatrix& OriginalMatrix); 
	//构造元素为零的矩阵 
	CMatrix(int4 i4RowNumber, int4 i4ColumnNumber); 
	//构造输入元素的矩阵 
	CMatrix(const f8* pData, int4 i4RowNumber, int4 i4ColumnNumber); 
	virtual ~CMatrix(); 
 
//operation 
public: 
	//功能:初始化矩阵 
	//参数:pData:原始数据首地址 
	//		i4RowNumber:矩阵行数 
	//		i4ColumnNumber:矩阵列数 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	InitMatrix(const f8* pData,int4 i4RowNumber, int4 i4ColumnNumber); 
 
	//功能:初始化空矩阵,开辟存储空间 
	//返回:成功返回1,失败返回0,参数错误返回-100	 
	int4	InitEmptyMatrix(int4 i4RowNumber, int4 i4ColumnNumber); 
 
	//功能:初始化零矩阵 
	//返回:成功返回1,失败返回0,参数错误返回-100	 
	int4	InitZeroMatrix(int4 i4RowNumber,int4 i4ColumnNumber); 
 
	//功能:得到原有矩阵的逆矩阵,原矩阵不变,效率高 
	//参数:maInverse :结果矩阵 
	//返回:成功 1 失败 0 
	int4	GetInverseMatrix(CMatrix& maInverse)const; 
 
	//功能:得到原有矩阵的逆矩阵,原矩阵不变 
	//返回:成功返回一个有效CMatrix对象,失败返回空矩阵 
	CMatrix GetInverseMatrix()const; 
 
	//功能:原有矩阵求逆 
	//返回:成功 1 失败 0 
	int4	Inverse(); 
 
	//功能:得到原有矩阵的转置矩阵,原矩阵不变 
	//参数:maTransposed :结果矩阵 
	//返回:成功 1 失败 0 
	int4	GetTransposedMatrix(CMatrix& maTransposed)const; 
 
	//功能:得到原有矩阵的转置矩阵,原矩阵不变 
	//返回:成功返回一个有效CMatrix对象,失败返回空矩阵 
	CMatrix GetTransposedMatrix()const; 
 
	//功能:原有矩阵转置 
	//返回:成功 1 失败 0 
	int4	Transpose(); 
	 
	//功能:得到原有矩阵的四舍五入整数矩阵,原矩阵不变 
	//返回:成功 1 失败 0 
	int4	GetRoundMatrix(CMatrix& maTransposed)const; 
 
	//功能:得到原有矩阵的四舍五入整数矩阵,原矩阵不变 
	//返回:成功返回一个有效CMatrix对象,失败返回空矩阵 
	CMatrix GetRoundMatrix()const; 
	 
	//功能:原有矩阵四舍五入,变成整数矩阵 
	//返回:成功 1 失败 0 
	int4	Round(); 
	 
	//功能:得到原有矩阵的左上角子矩阵,原矩阵不变 
	//参数: 
	//		nSubRowNumber:		新矩阵的行数 
	//		nSubColumnNumber:	新矩阵的列数 
	//		maSubMatrix:		结果矩阵 
	//返回:成功返回一个有效CMatrix对象,失败返回空矩阵 
	int4	GetLeftTopSubMatrix(int4 i4SubRowNumber, int4 i4SubColumnNumber, CMatrix& maSubMatrix)const; 
 
	//功能:得到原有矩阵的左上角子矩阵,原矩阵不变 
	//参数: 
	//		nSubRowNumber:		新矩阵的行数 
	//		nSubColumnNumber:	新矩阵的列数 
	//返回:成功返回一个有效CMatrix对象,失败返回空矩阵 
	CMatrix GetLeftTopSubMatrix(int4 i4SubRowNumber,int4 i4SubColumnNumber)const; 
 
	//功能:得到原有矩阵的任意位置子阵,原矩阵不变 
	//参数: 
	//		nBeginRowNo:		子阵在原有矩阵中的起始行号,从0起算 
	//		nSubRowNumber:		新矩阵的行数 
	//		nBeginColumnNo:		子阵在原有矩阵中的起始列号,从0起算 
	//		nSubColumnNumber:	新矩阵的列数 
	//		maSubMatrix			结果矩阵 
	//返回:1 成功;0 失败 
	int4	GetSubMatrix(int4 i4BeginRowNo, int4 i4SubRowNumber, int4 i4BeginColumnNo, int4 i4SubColumnNumber, CMatrix& maSubMatrix)const; 
 
	//功能:得到原有矩阵的任意位置子阵,原矩阵不变 
	//参数: 
	//		nBeginRowNo:		子阵在原有矩阵中的起始行号,从0起算 
	//		nSubRowNumber:		新矩阵的行数 
	//		nBeginColumnNo:		子阵在原有矩阵中的起始列号,从0起算 
	//		nSubColumnNumber:	新矩阵的列数 
	//返回:成功返回一个有效CMatrix对象,失败返回空矩阵 
	CMatrix GetSubMatrix(int4 i4BeginRowNo, int4 i4SubRowNumber, int4 i4BeginColumnNo, int4 i4SubColumnNumber)const; 
	 
	//功能:矩阵相加运算 
	//参数:maRight		被加数 
	//		maResult	相加后的结果矩阵 
	//返回:1 成功;0 失败 
	//使用示例:A.AddMatrix(B,C) 意为: C中的元素为A、B中元素之和 
	int4	AddMatrix(CMatrix& maRight, CMatrix& maResult)const; 
 
	//功能:矩阵相减运算 
	//参数:maRight		被减数 
	//		maResult	相减后的结果矩阵 
	//返回:1 成功;0 失败 
	//使用示例:A.SubMatrix(B,C) 意为: C中的元素为A、B中元素之差 
	int4	SubMatrix(CMatrix& maRight, CMatrix& maResult)const; 
	 
	//功能:矩阵相乘运算 
	//参数:maRight		被乘数 
	//		maResult	相乘后的结果矩阵 
	//返回:1 成功;0 失败 
	//使用示例:A.MultiplyMatrix(B,C) 意为: C中的元素为A、B中元素之积	 
	int4	MultiplyMatrix(CMatrix& maRight, CMatrix& maResult)const; 
	 
	//功能:更改矩阵中的某子块矩阵元素, 基于ChangeMember函数 
	//参数: 
	//		i4BeginRowNo	元素所在矩阵中的行数,从0起算 
	//		i4BeginColumnNo	元素所在矩阵中的列数,从0起算 
	//		maSecMatrix		元素改为的值 
	//返回:1 成功;0 失败 
	int4    ChangeSubMatrix(int4 i4BeginRowNo, int4 i4BeginColumnNo, const CMatrix& maSecMatrix); 
	 
	//增加矩阵中的某子块矩阵元素 
	//参数: 
	//		i4BeginRowNo	元素所在矩阵中的行数,从0起算 
	//		i4BeginColumnNo	元素所在矩阵中的列数,从0起算 
	//		maSecMatrix		元素改为的值 
	//返回:1 成功;0 失败 
	int4    AddSubMatrixMember(int4 i4BeginRowNo, int4 i4BeginColumnNo, const CMatrix& maSecMatrix); 
 
	//功能:以某一个数值,更改矩阵中的某行元素 
	//参数: 
	//		i4RowNo		要修改的行数,从0起算 
	//		f8Member	行元素改为的值 
	//返回:1 成功;0 失败 
	int4	ChangeOneRowWithMember(int4 i4RowNo, f8 f8Member); 
	 
	//功能:以某一个数值,更改矩阵中的某列元素 
	//参数: 
	//		i4ColumnNo	要修改的列数,从0起算 
	//		f8Member	列元素改为的值 
	//返回:1 成功;0 失败 
	int4	ChangeOneColumnWithMember(int4 i4ColumnNo, f8 f8Member); 
	 
	//功能:获取矩阵中的某个元素 
	//参数: 
	//		i4RowNo		元素所在矩阵中的行数,从0起算 
	//		i4ColumnNo	元素所在矩阵中的列数,从0起算 
	//		f8Member     : 有效的f8地址 
	//返回:1 成功;0 失败 
	int4	GetMember(int4 i4RowNo, int4 i4ColumnNo, f8& f8Member)const; 
 
	//功能:更改矩阵中的某个元素 
	//参数: 
	//		i4RowNo		元素所在矩阵中的行数,从0起算 
	//		i4ColumnNo	元素所在矩阵中的列数,从0起算 
	//		f8Member :  元素改为的值 
	//返回:1 成功;0 失败 
	int4	ChangeMember(int4 i4RowNo, int4 i4ColumnNo, f8 f8Member)const; 
 
	//功能:交换矩阵中指定的两行 
	//参数: 
	//		i4RowNo1	i4RowNo2	将要被交换的行号,从0起算 
	//返回:1 成功;0 失败 
	int4	ExChangeTwoRows(int4 i4RowNo1, int4 i4RowNo2)const; 
 
	//功能:交换矩阵中指定的两列 
	//参数: 
	//		i4ColumnNo1 i4ColumnNo2	将要被交换的列号,从0起算 
	//返回:1 成功;0 失败 
	int4	ExChangeTwoColumns(int4 i4ColumnNo1, int4 i4ColumnNo2)const; 
 
	//功能:在原有矩阵中追加一行 
	//参数:pData:		欲追加数据的首地址 
	//		nDataNumber:数据长度,原矩阵的列数 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	AppendNewRow(f8* pData, int4 i4DataNumber); 
 
	//功能:在原有矩阵中追加一列 
	//参数:pData:		欲追加数据的首地址 
	//		nDataNumber:数据长度,原矩阵的行数 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	AppendNewColumn(f8* pData, int4 i4DataNumber); 
 
	//功能:在原有矩阵中以行的形式追加矩阵,以追加行的形式实现 
	//参数:SecMatrix 	欲追加数据的矩阵 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	AppendMatrixInRow(const CMatrix& SecMatrix); 
 
	//功能:在原有矩阵中以列的形式追加矩阵,在追加行中实现 
	//参数:SecMatrix 	欲追加数据的矩阵 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	AppendMatrixInColumn(const CMatrix& SecMatrix); 
	 
	//功能:在原有矩阵中以矩阵形式追加对角矩阵,非对角子阵补零 
	//参数:SecMatrix 	欲追加数据的矩阵 
	//返回:成功返回1,失败返回0,参数错误返回-100	 
	//		| A 0| 
	//	A =	| 0 B| 
	int4	AppendMatrixInDiagonal(const CMatrix& SecMatrix);  
 
	//功能:在原有矩阵中以行形式插入矩阵 
	//参数:i4RowNo		元素所在矩阵中的行数,从0起算 
	//		SecMatrix 	欲追加数据的矩阵 
	//返回:成功返回1,失败返回0,参数错误返回-100	 
	int4	InsertMatrixInRow(int4 i4RowNo, const CMatrix& SecMatrix);  
	 
 
	//功能:在原有矩阵中以行形式插入矩阵 
	//参数:i4ColumnNo	元素所在矩阵中的列数,从0起算 
	//		SecMatrix 	欲追加数据的矩阵 
	//返回:成功返回1,失败返回0,参数错误返回-100	 
	int4	InsertMatrixInColomn(int4 i4ColumnNo, const CMatrix& SecMatrix);  
 
	//功能:在指定行后面添加一行,所添加行的元素全为f8Member 
	//参数:i4RowNo		指定行号,从0起算 
	//		f8Member 	元素 
	//返回:成功返回1,失败返回0 
	int4	InsertOneRowWithMember(int4 i4RowNo, f8 f8Member);  
	 
	//功能:在指定行后面添加一列,所添加列的元素全为f8Member 
	//参数:i4ColumnNo		指定列号,从0起算 
	//		f8Member 	元素 
	//返回:成功返回1,失败返回0	 
	int4	InsertOneColomnWithMember(int4 i4ColumnNo, f8 f8Member);  
	 
	//功能:获取原矩阵中的一行 
	//参数:nRowNo:	欲取数据在矩阵中的行号,从0起算 
	//		pData:		返回数据的首地址,必须已经实化,并有足够的空间 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	//注意:pData必须为有效地址,且空间长度必须大于等于矩阵的列数 
	int4	GetOneRow(int4 i4RowNo, f8* pData)const; 
 
	//功能:获取原矩阵中的一行 
	//参数:nRowNo:		欲取数据在矩阵中的行号,从0起算 
	//		maRowMAtrix:	行矩阵结果 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	GetOneRow(int4 i4RowNo, CMatrix& maRowMAtrix)const; 
	 
	//功能:获取原矩阵中的一列 
	//参数:nColumnNo:	欲取数据在矩阵中的列号,从0起算 
	//		pData:		返回数据的首地址,必须已经实化,并有足够的空间 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	//注意:pData必须为有效地址,且空间长度必须大于等于矩阵的行数 
	int4	GetOneColumn(int4 i4ColumnNo, f8* pData)const; 
 
	//功能:获取原矩阵中的一列 
	//参数: 
	//		nColumnNo:	欲取数据在矩阵中的列号,从0起算 
	//		maColumnMAtrix:	列矩阵结果 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	GetOneColumn(int4 i4ColumnNo, CMatrix& maColumnMAtrix)const; 
 
	//功能:在原有矩阵中删除一行 
	//参数:nRowNo:欲删除行的行号,从0起算 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	DeleteOneRow(int4 i4RowNo); 
 
	//功能:在原有矩阵中删除一行 
	//参数:nRowNo:欲删除行的行号,从0起算 
	//		maRowMAtrix:	行矩阵结果 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	DeleteOneRow(int4 i4RowNo, CMatrix& maRowMAtrix); 
	 
	//功能:在原有矩阵中删除一列 
	//参数:nColumnNo:	欲删除列的列号,从0起算 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	DeleteOneColumn(int4 i4ColumnNo); 
 
	//功能:在原有矩阵中删除一列 
	//参数:nColumnNo:		欲删除列的列号,从0起算 
	//		maColumnMatrix:	列矩阵结果 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	DeleteOneColumn(int4 i4ColumnNo, CMatrix& maColumnMatrix); 
	 
	//功能:将其他行的数据合并到目标行 
	//参数:nRowNo:欲合并的行号,从0起算 
	//		nComMode:合并模式:1:相加;-1:相减,其他行减目标行 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	CombineRow(int4 i4RowNo, int4 i4ComMode); 
 
	//功能:将前面行的数据合并到目标列 
	//参数:nColumnNo :欲合并的列号,从0起算 
	//		nComMode:合并模式:1:相加;-1:相减 
	//返回:成功返回1,失败返回0,参数错误返回-100 
	int4	CombineColumn(int4 i4ColumnNo, int4 i4ComMode); 
	 
	//功能:将矩阵清零,并不是将矩阵元素设零 
	//返回:成功返回1 
	int4	Dump(); 
 
	//功能:将矩阵元素设零 
	//返回:成功返回1 
	int4	SetZero(); 
 
	//功能:将矩阵元素设负 
	//返回:成功返回1 
	int4	SetMinus(); 
 
	//功能:将矩阵元素乘以倍数 
	//参数:f8MulNum	倍数 
	//返回:成功返回1 
	int4	Multiply(f8 f8MulNum); 
 
	//功能:将矩阵设成单位阵 
	//参数:nRowNumber	单位阵的维数 
	//返回:成功返回1 
	int4	SetIdentity(int4 i4RowNumber); 
 
	//功能:将矩阵设成简单相关阵 
	//参数:nRowNumber	相关阵的维数 
	//返回:成功返回1 
	int4	SetCorrelativity(int4 i4RowNumber); 
 
	int4 operator= (const CMatrix& SecMatrix); 
	CMatrix	operator+ (const CMatrix& SecMatrix)const; 
	CMatrix operator- (const CMatrix& SecMatrix)const; 
	CMatrix operator- (); 
	CMatrix operator* (const CMatrix& SecMatrix)const; 
	CMatrix operator* (const f8 f8MultiNum) const; 
	CMatrix operator/ (const f8 f8DevideNum) const; 
	CMatrix operator/ (const CMatrix& SecMatrix)const;// A/B:表示A乘以B的逆阵 
	CMatrix operator% (const CMatrix& SecMatrix)const;// A%B:表示A的逆阵乘以B 
	 
	int4 operator+= (const CMatrix& SecMatrix); 
	int4 operator-= (const CMatrix& SecMatrix); 
	BOOL operator== (const CMatrix& SecMatrix)const; 
	BOOL operator!= (const CMatrix& SecMatrix)const; 
 
//Attribute interface 
public: 
	int4	GetData(f8 * pDestiData)const; 
	f8*     GetDataAddress()const; 
	int4	GetRowNumber()const {return m_i4RowNumber;}; 
	int4	GetColumnNumber()const {return m_i4ColumnNumber;}; 
	f8	    GetTrace()const; 
	f8	    GetNorm()const; 
 
//protected operation 
private: 
	void	Initate(); 
	void	Transpose(const f8* pm1, f8* pm2, int4 i4m, int4 i4n)const; 
	void	Mult(const f8* pm1, const f8* pm2, f8* pResult, int4 i_1, int4 j_12, int4 j_2)const; 
	int4	InversMatrix(f8* pm1, int4 i4n)const; 
	//功能:四舍五入,计算最靠近的整数 
	//例如:1.2 -> 1; 1.8 -> 2; -33.3 -> -33; -6.9 -> -7  
	//参数:f8 dNum:要处理的实数 
	//返回:返回的整数 
	int4	round(f8 dNum)const; 
 
//Attribute 
//protected: 
public: 
	f8*   m_pData; 
	int4  m_i4RowNumber, m_i4ColumnNumber; 
	 
private://取消的操作 
}; 
double Det(CMatrix A); 
 
#endif // !defined(AFX_MATRIX_H__FF0DD7B1_E190_48F1_A1B2_5D5E7D69CA46__INCLUDED_)