c# 矩阵计算(转)

2005/5/15

C#矩阵类

在做神经网络类的时候自己写的矩阵类,重载了基本运算符,提供了转秩、求逆函数

求逆没有检测矩阵的秩是否符合要求。而且此矩阵类运算效率并不是很高,只可用于试验,或者数量级为100左右的矩阵运算。

下面是具体代码(使用System以及System.Math)

 public struct NNMatrix
 {
  public int row,col;
  public double[,] Matrix;

  public NNMatrix(int Mrow,int Mcol)  //指定行列数创建矩阵,初始值为0矩阵
  {
   row = Mrow;
   col = Mcol;
   Matrix = new double[row,col];
   for(int i=0;i<row;i++)
    for(int j=0;j<col;j++)
     Matrix[i,j]=0;
  }

  public static NNMatrix operator +(NNMatrix m1, NNMatrix m2)   //矩阵加法
  {
   if(m1.row==m2.row && m1.col==m2.col)
    for(int i=0;i<m1.row;i++)
     for(int j=0;j<m2.col;j++)
      m1.Matrix[i,j] += m2.Matrix[i,j];
   return(m1);
  }

  public static NNMatrix operator +(NNMatrix m1, double m2)    //矩阵加常量
  {
   for(int i=0;i<m1.row;i++)
    for(int j=0;j<m1.col;j++)
     m1.Matrix[i,j] += m2;
   return(m1);
  }

  public static NNMatrix operator -(NNMatrix m1, NNMatrix m2)  //矩阵减法
  {
   if(m1.row==m2.row && m1.col==m2.col)
    for(int i=0;i<m1.row;i++)
     for(int j=0;j<m2.col;j++)
      m1.Matrix[i,j] -= m2.Matrix[i,j];
   return(m1);
  }

  public static NNMatrix operator *(NNMatrix m1, NNMatrix m2) //矩阵乘法
  {
   if(m1.col == m2.row)
   {
    int m3r = m1.row;
    int m3c = m2.col;
    double[,] m3 = new double[m3r,m3c];
    for(int i=0;i<m3r;i++)
     for(int j=0;j<m3c;j++)
     {
      m3[i,j] = 0;
      for(int ii=0;ii<m3r;ii++)
       m3[i,j] += m1.Matrix[i,ii]*m2.Matrix[ii,j];
     }
                m1.Matrix = m3;
    m1.row = m3r;
    m1.col = m3c;
   }
   
   return(m1);
  }

  public static NNMatrix operator *(NNMatrix m1, double m2) //矩阵乘以常量
  {
   for(int i=0;i<m1.row;i++)
    for(int j=0;j<m1.col;j++)
     m1.Matrix[i,j] *= m2;
   return(m1);
  }

  public static void Transpos(NNMatrix srcm)  //矩阵转秩
  {
   double tmpv;
   for(int i=0;i<srcm.row;i++)
    for(int j=0;j<srcm.col;j++)
    {
     if(i!=j)
     {tmpv=srcm.Matrix[i,j];srcm.Matrix[i,j]=srcm.Matrix[j,i];srcm.Matrix[j,i]=tmpv;}
    }
   int tmprc;
   tmprc=srcm.row;srcm.row=srcm.col;srcm.col=tmprc;
  }

  private static void swaper(double m1,double m2)
  {
   double sw;
   sw=m1;m1=m2;m2=sw;
  }
  public static void Invers(NNMatrix srcm)           //矩阵求逆
  {
   int rhc = srcm.row;
   if(srcm.row == srcm.col)
   {
    int[] iss = new int[rhc];
    int[] jss = new int[rhc];
    double fdet = 1;
    int f=1;

    for(int k=0;k<rhc;k++)
    {
     double fmax = 0;
     for(int i=k;i<rhc;i++)
     {
      for(int j=k;j<rhc;j++)
      {
       f = Abs(srcm.Matrix[i,j]);
       if(f>fmax)
       {
        fmax=f;
        iss[k]=i;
        jss[k]=j;
       }
      }
     }
     if(iss[k]!=k)
     {
      f = -f;
      for(int ii=0;ii<rhc;ii++)
      {
       swaper(srcm.Matrix[k,ii],srcm.Matrix[iss[k],ii]);
      }
     }
                    if(jss[k]!=k)
     {
      f = -f;
      for(int ii=0;ii<rhc;ii++)
      {
       swaper(srcm.Matrix[k,ii],srcm.Matrix[jss[k],ii]);
      }
     }
     
     fdet*=srcm.Matrix[k,k];
     srcm.Matrix[k,k]=1/srcm.Matrix[k,k];
     for(int j=0;j<rhc;j++)
      if(j!=k)
       srcm.Matrix[k,j]*=srcm.Matrix[k,k];
     for(int i=0;i<rhc;i++)
      if(i!=k)
       for(int j=0;j<rhc;j++)
        if(j!=k)
         srcm.Matrix[i,j]=srcm.Matrix[i,j]-srcm.Matrix[i,k]*srcm.Matrix[k,j];
                    for(int i=0;i<rhc;i++)
         if(i!=k)
          srcm.Matrix[i,k]*=-srcm.Matrix[k,k];
    }

    for(int k=rhc-1;k>=0;k--)
    {
     if(jss[k]!=k)
      for(int ii=0;ii<rhc;ii++)
       swaper(srcm.Matrix[k,ii],srcm.Matrix[jss[k],ii]);
     if(iss[k]!=k)
      for(int ii=0;ii<rhc;ii++)
       swaper(srcm.Matrix[k,ii],srcm.Matrix[iss[k],ii]);
    }
   }

  }

  public string MatrixPrint()   //矩阵输出
  {
   string tmprst;
   tmprst = "/n";
   for(int i=0;i<row;i++)
   {
    for(int j=0;j<col;j++)
    {
     tmprst += Matrix[i,j].ToString() + "/t";
    }
    tmprst += "/n";
   }
   return tmprst;

你可能感兴趣的:(c# 矩阵计算(转))