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

📄 matrix.cpp

📁 一个实现3层BP人工神经网络的类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
    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 + -