c# 矩阵计算(转)
来源:互联网 发布:mac如何卸载mysql 编辑:程序博客网 时间:2024/05/16 08:37
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;i++)
{
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# 矩阵计算(转)
- c# 矩阵计算(转)
- 九度OJ 1193:矩阵转置 (矩阵计算)
- C# 训练场(二)用运算符重载实现矩阵计算
- HDU2371 矩阵计算转置
- 协方差矩阵的定义及其计算公式 (转)
- 矩阵计算
- 矩阵计算
- 矩阵计算
- 矩阵计算
- 数学-矩阵计算(2)矩阵函数微积分前奏
- 九度OJ 1180:对称矩阵 (矩阵计算)
- 九度OJ 1191:矩阵最大值 (矩阵计算)
- 相机参数矩阵计算(内外矩阵)以及光束法平差
- 选择矩阵(选择矩阵是稀疏的)相关计算
- 转:用 Hadoop 计算共生矩阵
- GPU计算矩阵相乘(未优化)
- hdu2807(floyd +快速矩阵计算)
- Windows挂钩的简单使用
- 格式转换介绍
- Vmware 6.0.0 build-45731 在 Linux 2.6.X 安装 VmTools 的问题的解决方法
- Essential c++ 第六章二叉树的完整实现
- 关于SetWindowsHookEx【HOOK钩子】
- c# 矩阵计算(转)
- (11月22号李开复)21世纪最需要的七种人才
- JAR 文件打包方法
- 《孙子初问世》--游戏策划书
- c# 矩阵计算(转)
- 不能读取 AppletViewer 的属性文件解决
- NHibernate教程
- 常见逻辑谬误
- DLL(Dynamic Link Libraries) 专题