📄 matrix.cpp
字号:
{
if(pMatrix!=0)
{
if(m_nRows==OneMatrix.m_nRows && m_nCols==OneMatrix.m_nCols)
{
for(int i=0; i<m_nRows; i++)
for(int j=0; j<m_nCols; j++) pMatrix[i*m_nCols+j]=OneMatrix.pMatrix[i*m_nCols+j];
}
else
{
throw TCustomExcep(3,"相互赋值的矩阵或数组必须维数相同!");
}
}
else
{
//分配存贮空间
m_nRows=OneMatrix.m_nRows;
m_nCols=OneMatrix.m_nCols;
pMatrix=new double[m_nRows*m_nCols];
if(pMatrix!=0)
{
for(int i=0; i<m_nRows; i++)
for(int j=0; j<m_nCols; j++) pMatrix[i*m_nCols+j]=OneMatrix.pMatrix[i*m_nCols+j];
}
else
{
throw TCustomExcep(1,"矩阵对象分配失败!");
}
}
}
//重载加"+"运算符(成员函数):矩阵+矩阵
TMatrix TMatrix::operator +(const TMatrix OneMatrix)
{
TMatrix Temp;
if((m_nRows==OneMatrix.m_nRows) && (m_nCols==OneMatrix.m_nCols))
{
//矩阵中元素相加
Temp.InitByData(m_nRows,m_nCols);
for(int i=0;i<m_nRows;i++)
for(int j=0;j<m_nCols;j++) Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]+OneMatrix.pMatrix[i*m_nCols+j];
}
return Temp;
}
//重载+=运算符:矩阵+矩阵
void TMatrix::operator +=(const TMatrix OneMatrix)
{
TMatrix Temp;
if((m_nRows==OneMatrix.m_nRows) && (m_nCols==OneMatrix.m_nCols))
{
//矩阵中元素相加
Temp.InitByData(m_nRows,m_nCols);
for(int i=0;i<m_nRows;i++)
{
for(int j=0;j<m_nCols;j++)
{
Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]+OneMatrix.pMatrix[i*m_nCols+j];
pMatrix[i*m_nCols+j]=Temp.pMatrix[i*m_nCols+j];
}
}
}
else
throw TCustomExcep(3,"相互赋值的矩阵或数组必须维数相同!");
}
//重载+运算符(成员函数):矩阵中每一元素均与某常数相加
TMatrix TMatrix::operator +(double Data)
{
TMatrix Temp(m_nRows,m_nCols);
for(int i=0;i<m_nRows;i++)
for(int j=0;j<m_nCols;j++) Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]+Data;
return Temp;
}
//重载+运算符(友员函数):矩阵中每一元素均与某常数相加
TMatrix operator +(double Data,TMatrix OneMatrix)
{
int nRows=OneMatrix.m_nRows;
int nCols=OneMatrix.m_nCols;
TMatrix Temp(nRows,nCols);
for(int i=0;i<nRows;i++)
for(int j=0;j<nCols;j++) Temp.pMatrix[i*nCols+j]=OneMatrix.pMatrix[i*nCols+j]+Data;
return Temp;
}
//重载减"-"运算符(成员函数)
TMatrix TMatrix::operator -(const TMatrix OneMatrix)
{
TMatrix Temp;
if((m_nRows==OneMatrix.m_nRows) && (m_nCols==OneMatrix.m_nCols))
{
//矩阵中元素相减
Temp.InitByData(m_nRows, m_nCols);
for(int i=0;i<m_nRows;i++)
for(int j=0;j<m_nCols;j++) Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]-OneMatrix.pMatrix[i*m_nCols+j];
}
return Temp;
}
//重载负号(友元函数)
TMatrix operator -(const TMatrix OneMatrix)
{
int nRows=OneMatrix.m_nRows;
int nCols=OneMatrix.m_nCols;
TMatrix Temp(nRows,nCols);
for(int i=0;i<nRows;i++)
for(int j=0;j<nCols;j++) Temp.pMatrix[i*nCols+j]=-1*OneMatrix.pMatrix[i*nCols+j];
return Temp;
}
//重载*运算符(友员函数):常数*矩阵
TMatrix operator *(double Data,TMatrix OneMatrix)
{
int nRows=OneMatrix.m_nRows;
int nCols=OneMatrix.m_nCols;
TMatrix Temp(nRows,nCols);
for(int i=0;i<nRows;i++)
for(int j=0;j<nCols;j++) Temp.pMatrix[i*nCols+j]=Data*OneMatrix.pMatrix[i*nCols+j];
return Temp;
}
//重载*运算符:矩阵*常数
TMatrix TMatrix::operator *(double Data)
{
TMatrix Temp(m_nRows,m_nCols);
for(int i=0;i<m_nRows;i++)
for(int j=0;j<m_nCols;j++) Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]*Data;
return Temp;
}
//重载*运算符:矩阵*矩阵
TMatrix TMatrix::operator *(const TMatrix OneMatrix)
{
TMatrix Temp;
if(m_nCols==OneMatrix.m_nRows) //判断两个矩阵可否相乘[m][n]、[n][k]
{
int nRows=m_nRows;
int nCols=OneMatrix.m_nCols;
//计算乘积
Temp.InitByData(nRows,nCols);
for(int i=0;i<nRows;i++)
{
for(int j=0;j<nCols;j++)
{
double sum=0.0;
for(int k=0;k<m_nCols;k++) sum+=pMatrix[i*m_nCols+k]*OneMatrix.pMatrix[k*nCols+j];
Temp.pMatrix[i*nCols+j]=sum;
}
}
}
return Temp;
}
//重载运算符(&&):其义被设为对应元素相乘.
TMatrix TMatrix::operator &&(TMatrix OneMatrix)
{
TMatrix Temp;
if(m_nRows==OneMatrix.m_nRows && m_nCols==OneMatrix.m_nCols)
{
Temp.InitByData(m_nRows,m_nCols);
for(int i=0;i<m_nRows;i++)
for(int j=0;j<m_nCols;j++) Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]*OneMatrix.pMatrix[i*m_nCols+j];
}
return Temp;
}
//求转置矩阵
TMatrix TMatrix::Transpose()
{
TMatrix Temp;
if(pMatrix!=NULL)
{
Temp.InitByData(m_nCols,m_nRows);
for(int i=0;i<m_nCols;i++)
for(int j=0;j<m_nRows;j++) Temp.pMatrix[i*m_nRows+j]=pMatrix[j*m_nCols+i];
}
return Temp;
}
//功 能:采用全选主高斯--约当法对一般[n][n]阶实矩阵求逆
//返回值:若执行无误,则返回原矩阵的逆矩阵;否则,返回一空矩阵。
TMatrix TMatrix::Anti()
{
TMatrix Temp;
if(m_nRows!=m_nCols)
{
throw TCustomExcep(6,"只允许对方阵求逆!");
}
else
{
int nRows=m_nRows;
double *pData=new double[nRows*nRows];
int i,j,k,l,u,v;
for(i=0;i<m_nRows;i++)
for(j=0;j<m_nCols;j++) pData[i*m_nCols+j]=pMatrix[i*m_nCols+j];
double d,p;
int *pRowInfo,*pColInfo;
pRowInfo=new int[nRows]; //存储计算过程中的行交换信息
pColInfo=new int[nRows]; //存储计算过程中的列交换信息
for(k=0;k<nRows;k++)
{
d=0.0;
for(i=k;i<nRows;i++)
{
for(j=k;j<nRows;j++)
{
l=i*nRows+j;
p=fabs(pData[l]);
if(p>d){ d=p; pRowInfo[k]=i; pColInfo[k]=j; }
}
}
if(d+1.0==1.0) throw TCustomExcep(6,"只允许对非奇异矩阵求逆!");
if(pRowInfo[k]!=k)
{
for(j=0;j<nRows;j++)
{
u=k*nRows+j;
v=pRowInfo[k]*nRows+j;
p=pData[u];
pData[u]=pData[v];
pData[v]=p;
}
}
if(pColInfo[k]!=k)
{
for(i=0;i<nRows;i++)
{
u=i*nRows+k;
v=i*nRows+pColInfo[k];
p=pData[u];
pData[u]=pData[v];
pData[v]=p;
}
}
l=k*nRows+k;
pData[l]=1.0/pData[l];
for(j=0;j<nRows;j++)
{
if(j!=k)
{
u=k*nRows+j;
pData[u]=pData[u]*pData[l];
}
}
for(i=0;i<nRows;i++)
{
if(i!=k)
{
for(j=0;j<nRows;j++)
{
if(j!=k)
{
u=i*nRows+j;
pData[u]=pData[u]-pData[i*nRows+k]*pData[k*nRows+j];
}
}
}
}
for(i=0;i<nRows;i++)
{
if(i!=k)
{
u=i*nRows+k;
pData[u]=-pData[u]*pData[l];
}
}
}
for(k=nRows-1;k>=0;k--)
{
if(pColInfo[k]!=k)
{
for(j=0;j<nRows;j++)
{
u=k*nRows+j;
v=pColInfo[k]*nRows+j;
p=pData[u];
pData[u]=pData[v];
pData[v]=p;
}
}
if(pRowInfo[k]!=k)
{
for(i=0;i<nRows;i++)
{
u=i*nRows+k;
v=i*nRows+pRowInfo[k];
p=pData[u];
pData[u]=pData[v];
pData[v]=p;
}
}
}
Temp.InitByArray(pData,m_nRows,m_nRows);
delete[] pData;
delete[] pRowInfo;
delete[] pColInfo;
}
return Temp;
}
/*函 数:Linear()。
参 数:double LowLimit---线性化后的下限;
double HighLimit--线性化后的上限。
功 能:直接将矩阵各行分别线性化于区间[LowLimit,HighLimit]内,用于神经网络的训练。
返回值:TMatrix类,其元素为各行线性化所需的斜率、截距。 */
TMatrix TMatrix::Linear(double LowLimit,double HighLimit)
{
double Slope,Offset; //直线的斜率、截距
double TempMax,TempMin;
TMatrix Temp;
if(pMatrix!=NULL)
{
Temp.InitByData(m_nRows,2);
for(int i=0; i<m_nRows; i++)
{
TempMax=-1000000000.0;
TempMin=100000000.0;
for(int j=0; j<m_nCols; j++)
{
if(pMatrix[i*m_nCols+j]>TempMax) TempMax=pMatrix[i*m_nCols+j];
if(pMatrix[i*m_nCols+j]<TempMin) TempMin=pMatrix[i*m_nCols+j];
}
Slope=(HighLimit-LowLimit)/(TempMax-TempMin); //斜率
Offset=HighLimit-TempMax*(HighLimit-LowLimit)/(TempMax-TempMin); //截距
Temp.pMatrix[i*2]=Slope;
Temp.pMatrix[i*2+1]=Offset;
for(int j=0; j<m_nCols; j++) pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]*Slope+Offset;
}
}
return Temp;
}
/*函 数:Linear()。
参 数:TMatrix& LineInfo---存放线性化所需斜率、截距的矩阵,[m_nRows][2]。
功 能:将矩阵各行分别线性化,用于神经网络的实际使用。
返回值:TMatrix类,其元素为线性化后的矩阵。 */
TMatrix TMatrix::Linear(TMatrix& LineInfo)
{
TMatrix Temp;
if(pMatrix!=NULL && m_nRows==LineInfo.m_nRows && LineInfo.m_nCols==2)
{
Temp.InitByData(m_nRows,m_nCols);
for(int i=0; i<m_nRows; i++)
for(int j=0; j<m_nCols; j++)
Temp.pMatrix[i*m_nCols+j]=pMatrix[i*m_nCols+j]*LineInfo.pMatrix[i*2]+LineInfo.pMatrix[i*2+1];
}
return Temp;
}
/*函 数:DeLinear()。
参 数:TMatrix& LineInfo---逆线性化所需的斜率、截距,[m_nRows][2]。
功 能:将矩阵各行分别逆线性化,用于神经网络。
返回值:TMatrix类,逆线性化后的矩阵。 */
TMatrix TMatrix::DeLinear(TMatrix& LineInfo)
{
TMatrix Temp;
if(pMatrix!=NULL && m_nRows==LineInfo.m_nRows && LineInfo.m_nCols==2)
{
Temp.InitByData(m_nRows,m_nCols);
for(int i=0; i<m_nRows; i++)
for(int j=0; j<m_nCols; j++)
Temp.pMatrix[i*m_nCols+j]=(pMatrix[i*m_nCols+j]-LineInfo.pMatrix[i*2+1])/LineInfo.pMatrix[i*2];
}
return Temp;
}
/*函 数:TanH()。
参 数:Input---TMatrix类型,输入变量阵。
u ---TMatrix类型,实为列向量,TanH函数的参数。
o ---TMatrix类型,实为列向量,TanH函数的参数。
注意:此三阵的行数需相同。
功 能:求取Input矩阵各行元素的TanH函数值,用于神经网络。
返回值:CMatrix类型,Input矩阵元素的TanH函数值。 */
TMatrix TanH(TMatrix& Input,TMatrix& u,TMatrix& o)
{
double TempIn,TempU,TempO;
int nRows=Input.m_nRows;
int nCols=Input.m_nCols;
TMatrix Temp(nRows,nCols);
if(nRows==u.m_nRows && nRows==o.m_nRows)
{
for(int i=0;i<nRows;i++)
{
TempU=u.pMatrix[i];
TempO=o.pMatrix[i];
for(int j=0;j<nCols;j++)
{
TempIn=Input.pMatrix[i*nCols+j];
Temp.pMatrix[i*nCols+j]=(1-exp(-TempU*(TempIn-TempO)))/(1+exp(-TempU*(TempIn-TempO)));
}
}
}
return Temp;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -