在做神经网络类的时候自己写的矩阵类,重载了基本运算符,提供了转秩、求逆函数
求逆没有检测矩阵的秩是否符合要求。而且此矩阵类运算效率并不是很高,只可用于试验,或者数量级为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;