📄 cmatrix.cpp
字号:
// 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 + -