⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmatrix.cpp

📁 GPS坐标转换软件与源程序 支持世界上大多数坐标框架下
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Matrix.cpp: implementation of the CMatrix class.
//
//////////////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "CMatrix.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//功能:构造函数,初始化矩阵
//参数:无
//返回值:无
CMatrix::CMatrix()
{
	Initate();
}



//功能:构造函数
// 参数:
//     OriginalMatrix:原始矩阵
//返回值:无
CMatrix::CMatrix(const CMatrix& OriginalMatrix)
{
	//构造函数不能嵌套!!
	Initate();//作为构造函数,它完全可以被第一步执行,所以总必须对自身的成员变量做初始化,此句必不可少!!
	InitMatrix(OriginalMatrix.GetDataAddress(), OriginalMatrix.GetRowNumber(), OriginalMatrix.GetColumnNumber());
}


//功能:构造函数,初始化矩阵
//参数:1 pData: 矩阵数据首地址
//      2 nRowNumber: 矩阵行数
//      3 nColumnNumber: 矩阵列数
//返回值:无
CMatrix::CMatrix(const f8* pData,i4 nRowNumber,i4 nColumnNumber)
{
	Initate();//作为构造函数,它完全可以被第一步执行,所以总必须对自身的成员变量做初始化,此句必不可少!!
	InitMatrix(pData, nRowNumber, nColumnNumber);
}



CMatrix::~CMatrix()
{
	if (m_pData) 
	{
		delete [] m_pData;
		m_pData = NULL;
	}
}



//功能:初始化矩阵
//参数:
//      1 pData:原始数据首地址
//		2 nRowNumber:矩阵行数
//		3 nColumnNumber:矩阵列数
//返回值:成功返回1,失败返回0,参数错误返回-100
//注意:所有初始化函数或重载操作的根本函数!!
//////////////////////////////////////////////////////////////////////
i4 CMatrix::InitMatrix(const f8* pData,i4 nRowNumber,i4 nColumnNumber)
{
	if(!(pData && nRowNumber && nColumnNumber)) return -100;

	//指针赋值
	//1 如果原有空间和现在空间同大,即可直接赋值
	//2 如果不同,即有两种情况:1、刚定义之矩阵,数据为空;2、有数据量不同的数据
	if(m_nRowNumber * m_nColumnNumber != nRowNumber *nColumnNumber)
	{
		
		if (m_pData) delete [] m_pData;//和原有数据断绝关系
		m_pData = NULL;
		m_pData = new f8[ nRowNumber * nColumnNumber ];
		if(!m_pData) return 0;
	}
	memmove( m_pData, pData, sizeof(f8) * nRowNumber * nColumnNumber );

	//其他成员变量
	m_nRowNumber = nRowNumber;
	m_nColumnNumber = nColumnNumber;
	m_dTrace		= 0;
	m_dValue		= 0;
	m_dNorm			= 0;
	m_bTraceIsGot	= 0;
	m_bValueIsGot	= 0;
	m_bNormIsGot	= 0;
	
	return 1;
}



//功能:初始化零矩阵
//参数:
//		nRowNumber:矩阵行数
//		nColumnNumber:矩阵列数
//返回值:成功返回1,失败返回0,参数错误返回-100
i4 CMatrix::InitZeroMatrix(i4 nRowNumber,i4 nColumnNumber)
{
	InitEmptyMatrix(nRowNumber, nColumnNumber);
	memset(m_pData,0,sizeof(f8)*nRowNumber * nColumnNumber);

	return 1;
}

//功能:初始化矩阵,所有为0
//参数:无
//返回值:无
void CMatrix::Initate()
{
	m_pData			= NULL;
	m_nRowNumber	= 0;
	m_nColumnNumber	= 0;
	m_dTrace		= 0;
	m_dValue		= 0;
	m_dNorm			= 0;
	m_bTraceIsGot	= 0;
	m_bValueIsGot	= 0;
	m_bNormIsGot	= 0;
	
}



//功能:初始化空矩阵,开辟存储空间
//参数:
//		nRowNumber:矩阵行数
//		nColumnNumber:矩阵列数
//返回值:成功返回1,失败返回0,参数错误返回-100
i4 CMatrix::InitEmptyMatrix(i4 nRowNumber,i4 nColumnNumber)
{
	if (m_pData) 
	{
		delete [] m_pData;
		m_pData=NULL;
	}
	m_pData = new f8[ nRowNumber * nColumnNumber ];
	m_nRowNumber	= nRowNumber;
	m_nColumnNumber	= nColumnNumber;
	m_dTrace		= 0;
	m_dValue		= 0;
	m_dNorm			= 0;
	m_bTraceIsGot	= 0;
	m_bValueIsGot	= 0;
	m_bNormIsGot	= 0;
	
	return 1;
}



//功能: 将矩阵清零
//参数:无
//返回值:成功返回1
i4 CMatrix::Dump()
{
	if (m_pData)
	{
		delete [] m_pData;//和原有数据断绝关系
		m_pData=NULL;
	}
	m_nRowNumber = 0;
	m_nColumnNumber = 0;
	m_dTrace		= 0;
	m_dValue		= 0;
	m_dNorm			= 0;
	m_bTraceIsGot	= 0;
	m_bValueIsGot	= 0;
	m_bNormIsGot	= 0;
	
	return 1;
}


//功能:获取矩阵首地址
//参数:
//        pDestiData :目标地址
//返回值:1
//注意:pDestiData必须为有效空间的首地址!!
i4 CMatrix::GetData(f8 * pDestiData) const
{
	memcpy(pDestiData,this->m_pData, sizeof(f8) * m_nRowNumber * m_nColumnNumber);
	return 1;
}

i4 CMatrix::GetData(i4 n,f8 * pDestiData) const
{
	memcpy(pDestiData,this->m_pData+n, sizeof(f8) * (m_nRowNumber * m_nColumnNumber-n));
	return 1;
}

//功能:返回矩阵的首地址
//参数:无
//返回值:矩阵的首地址
//注意:这是一个非常危险的函数,它返回矩阵的首地址,这样用户就可能损坏此矩阵数据!!
f8* CMatrix::GetDataAddress() const
{ 
	return m_pData; 
}


//功能:得到原有矩阵的逆矩阵,原矩阵不变,效率高
/*参数:
		maInverse :结果矩阵
返回值:成功 1 失败 0*/
i4 CMatrix::GetInverseMatrix(CMatrix& maInverse)const
{
	if( m_nRowNumber != m_nColumnNumber) return 0;

	maInverse = *this;
	this->InversMatrix(maInverse.GetDataAddress(),m_nRowNumber);

	return 1;
}


//功能:得到原有矩阵的逆矩阵,原矩阵不变,效率低,但是使用方便
/*参数:无
返回值:成功返回一个有效CMatrix对象,失败返回空矩阵*/
CMatrix CMatrix::GetInverseMatrix()const
{
	CMatrix TmpMatrix;
	if( m_nRowNumber != m_nColumnNumber) return TmpMatrix;//如果不为方阵,则返回空阵

	TmpMatrix = *this;
	this->InversMatrix(TmpMatrix.GetDataAddress(),m_nRowNumber);

	return TmpMatrix;
}

//功能:原有矩阵求逆
/*参数:无
返回值:成功 1 失败 0*/
i4 CMatrix::Inverse()
{
	if(m_nRowNumber != m_nColumnNumber) return 0;
	this->InversMatrix(m_pData, m_nRowNumber);

	return 1;
}

 
//功能:得到原有矩阵的转置矩阵,原矩阵不变,效率高
/*参数:
		maTransposed :结果矩阵
返回值:成功 1 失败 0*/
i4 CMatrix::GetTransposedMatrix(CMatrix& maTransposed)const
{
	maTransposed.InitEmptyMatrix(m_nColumnNumber,m_nRowNumber);
	Transpose(m_pData,maTransposed.GetDataAddress(),m_nRowNumber,m_nColumnNumber);
	
	return 1;
}



//功能:得到原有矩阵的转置矩阵,原矩阵不变,效率低,但是使用方便
/*参数:无
返回值:成功返回一个有效CMatrix对象,失败返回空矩阵*/
CMatrix CMatrix::GetTransposedMatrix()const
{
	CMatrix TmpMatrix;	TmpMatrix.InitEmptyMatrix(m_nColumnNumber,m_nRowNumber);
	Transpose(m_pData,TmpMatrix.GetDataAddress(),m_nRowNumber,m_nColumnNumber);
	
	return TmpMatrix;
}


//功能:得到原有矩阵的左上角子矩阵,原矩阵不变,效率高
/*参数:
		nSubRowNumber:		新矩阵的行数
		nSubColumnNumber:	新矩阵的列数
		maSubMatrix:		结果矩阵
返回值:成功返回一个有效CMatrix对象,失败返回空矩阵*/
i4 CMatrix::GetSubMatrix(i4 nSubRowNumber,i4 nSubColumnNumber,CMatrix& maSubMatrix)const
{
	if(nSubRowNumber>m_nRowNumber || nSubColumnNumber>m_nColumnNumber) return 0;
	
	maSubMatrix = *this;
	for(i4 i=0;i<(m_nRowNumber-nSubRowNumber);i++)
	{
		maSubMatrix.DeleteOneRow(nSubRowNumber);
	}
	for(int i=0;i<(m_nColumnNumber-nSubColumnNumber);i++)
	{
		maSubMatrix.DeleteOneColumn(nSubColumnNumber);
	}

	return 1;
}




//功能:得到原有矩阵的左上角子矩阵,原矩阵不变,效率低,但是使用方便
/*参数:
		nSubRowNumber:		新矩阵的行数
		nSubColumnNumber:	新矩阵的列数
返回值:成功返回一个有效CMatrix对象,失败返回空矩阵*/
CMatrix CMatrix::GetSubMatrix(i4 nSubRowNumber,i4 nSubColumnNumber)const
{
	CMatrix maResult;
	if(nSubRowNumber>m_nRowNumber || nSubColumnNumber>m_nColumnNumber) return maResult;
	
	maResult = *this;
	for(i4 i=0;i<(m_nRowNumber-nSubRowNumber);i++)
	{
		maResult.DeleteOneRow(nSubRowNumber);
	}
	for(int i=0;i<(m_nColumnNumber-nSubColumnNumber);i++)
	{
		maResult.DeleteOneColumn(nSubColumnNumber);
	}

	return maResult;
}

//功能:得到原有矩阵的任意位置子阵,原矩阵不变,效率低,但是使用方便
/*参数:
		nBeginRowNo:		子阵在原有矩阵中的起始行号,从0起算
		nEndRowNo:			子阵在原有矩阵中的结束行号,从0起算
		nBeginColumnNo:		子阵在原有矩阵中的起始列号,从0起算
		nEndColumnNo:		子阵在原有矩阵中的结束列号,从0起算
返回值:成功返回一个有效CMatrix对象,失败返回空矩阵*/
CMatrix CMatrix::GetSubMatrix(const i4 nBeginRowNo,const i4 nEndRowNo,const i4 nBeginColumnNo,const i4 nEndColumnNo)const
{
	CMatrix maResult;
	if(nEndRowNo >= m_nRowNumber || nEndColumnNo >= m_nColumnNumber) return maResult;
	
	maResult = *this;
	//删除行
	for(i4 i=0;i<nBeginRowNo;i++)
	{
		maResult.DeleteOneRow(0);
	}
	for(int i=m_nRowNumber-1;i>nEndRowNo;i--)
	{
		maResult.DeleteOneRow(nEndRowNo - nBeginRowNo + 1);
	}
	//删除列
	for(int i=0;i<nBeginColumnNo;i++)
	{
		maResult.DeleteOneColumn(0);
	}
	for(int i=m_nColumnNumber-1;i>nEndColumnNo;i--)
	{
		maResult.DeleteOneColumn(nEndColumnNo - nBeginColumnNo + 1);
	}

	return maResult;
}
/******************************************************************************/
/*Function: Append a sub-matrix at right-bottom of original matrix. the original
			matrix don't change.the new maxtrix is maSuperMatrix.
			high efficient.
  Parameters:
		this:				the matrix to be added.
		maSubMatrix:		the matrix to add.
		maSuperMatrix:		the new matrix stored added matrix.
  Return:	
		Success return 1;
		else return 0;
*/
/******************************************************************************/
i4 CMatrix::AppendRBSubMatrix(const CMatrix maSubMatrix, CMatrix& maSuperMaxtrix) const
{
	maSuperMaxtrix.Dump();
	maSuperMaxtrix.InitMatrix(m_pData,m_nRowNumber,m_nColumnNumber) ;
	f8* pData = new f8[m_nRowNumber];
	memset(pData,0,m_nRowNumber*sizeof(*pData));
	int ColNum=m_nColumnNumber+maSubMatrix.GetColumnNumber();
	//append column first.
	for (int i=0;i<maSubMatrix.GetColumnNumber();i++)
	{
		maSuperMaxtrix.AppendNewColumn(pData,m_nRowNumber);	
	}

	SAFE_DELETE_ARRAY(pData);
	pData = new f8[ColNum];		// a row
	memset(pData,0,ColNum*sizeof(*pData));
	for (int i=0;i<maSubMatrix.GetRowNumber();i++)
	{
		for (i4 j=m_nColumnNumber;j<ColNum;j++)
		{	
			pData[j] = maSubMatrix.GetMember(i,j-m_nColumnNumber);
		}
		maSuperMaxtrix.AppendNewRow(pData,ColNum);
	}
	SAFE_DELETE_ARRAY(pData);
	return 1;
}
/******************************************************************************/
/*Function: Append a sub-matrix at right-bottom of original matrix. the original
			matrix don't change.the new maxtrix is maSuperMatrix.
			inefficient.
  Parameters:
		this:				the matrix to be added.
		maSubMatrix:		the matrix to add.
		
  Return:	
		maSuperMatrix:		the new matrix stored added matrix.
*/
/******************************************************************************/
// CMatrix CMatrix::AppendRBSubMatrix(const CMatrix maSubMatrix)const
// {
// 	CMatrix maSuperMatrix;
// 	AppendRBSubMatrix(maSubMatrix, maSuperMatrix);
// 	return maSuperMatrix;
// }

/******************************************************************************/
/*Function: Append a sub-matrix at right of original matrix. the original
			matrix don't change.the new maxtrix is maSuperMatrix. the row of too
			matrix is equal.	high efficient.
  Parameters:
		this:				the matrix to be added.
		maSubMatrix:		the matrix to add.
		maSuperMatrix:		the new matrix stored added matrix.
  Return:	
		Success return 1;
		else return 0;
*/
/******************************************************************************/
i4 CMatrix::AppendRSubMatrix(const CMatrix maSubMatrix, CMatrix& maSuperMaxtrix)const
{
	if (m_nRowNumber != maSubMatrix.GetRowNumber()) return 0;
	maSuperMaxtrix = *this;
	f8* pData = new f8[m_nRowNumber];
	memset(pData,0,m_nRowNumber*sizeof(*pData));
	
	//append column.
	CMatrix matrix;
	maSubMatrix.GetTransposedMatrix(matrix);
	for (int i=0;i<maSubMatrix.GetColumnNumber();i++)
	{
		matrix.GetOneRow(i,pData);
		maSuperMaxtrix.AppendNewColumn(pData,m_nRowNumber);	
	}
	SAFE_DELETE_ARRAY(pData);
	return 1;
}

// CMatrix CMatrix::AppendRSubMatrix(const CMatrix maSubMatrix)const
// {
// 	if (m_nRowNumber != maSubMatrix.GetRowNumber()) return 0;
// 	CMatrix maSuperMatrix;
// 	AppendRSubMatrix(maSubMatrix, maSuperMatrix);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -