C#中矩阵运算方法实例分析
本文实例讲述了C#中矩阵运算方法。分享给大家供大家参考。具体分析如下:
一、测试环境:
主机:XP
开发环境:VS2008
二、功能:
在C#中实现矩阵运算
三、源代码:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
//矩阵数据结构
//二维矩阵
class_Matrix
{
publicintm;
publicintn;
publicfloat[]arr;
//初始化
public_Matrix()
{
m=0;
n=0;
}
public_Matrix(intmm,intnn)
{
m=mm;
n=nn;
}
//设置m
publicvoidset_mn(intmm,intnn)
{
m=mm;
n=nn;
}
//设置m
publicvoidset_m(intmm)
{
m=mm;
}
//设置n
publicvoidset_n(intnn)
{
n=nn;
}
//初始化
publicvoidinit_matrix()
{
arr=newfloat[m*n];
}
//释放
publicvoidfree_matrix()
{
//delete[]arr;
}
//读取i,j坐标的数据
//失败返回-31415,成功返回值
publicfloatread(inti,intj)
{
if(i>=m||j>=n)
{
return-31415;
}
//return*(arr+i*n+j);
returnarr[i*n+j];
}
//写入i,j坐标的数据
//失败返回-1,成功返回1
publicintwrite(inti,intj,floatval)
{
if(i>=m||j>=n)
{
return-1;
}
arr[i*n+j]=val;
return1;
}
};
//二维运算类
class_Matrix_Calc
{
//初始化
public_Matrix_Calc()
{
}
//C=A+B
//成功返回1,失败返回-1
publicintadd(ref_MatrixA,ref_MatrixB,ref_MatrixC)
{
inti=0;
intj=0;
//判断是否可以运算
if(A.m!=B.m||A.n!=B.n||
A.m!=C.m||A.n!=C.n)
{
return-1;
}
//运算
for(i=0;i<C.m;i++)
{
for(j=0;j<C.n;j++)
{
C.write(i,j,A.read(i,j)+B.read(i,j));
}
}
return1;
}
//C=A-B
//成功返回1,失败返回-1
publicintsubtract(ref_MatrixA,ref_MatrixB,ref_MatrixC)
{
inti=0;
intj=0;
//判断是否可以运算
if(A.m!=B.m||A.n!=B.n||
A.m!=C.m||A.n!=C.n)
{
return-1;
}
//运算
for(i=0;i<C.m;i++)
{
for(j=0;j<C.n;j++)
{
C.write(i,j,A.read(i,j)-B.read(i,j));
}
}
return1;
}
//C=A*B
//成功返回1,失败返回-1
publicintmultiply(ref_MatrixA,ref_MatrixB,ref_MatrixC)
{
inti=0;
intj=0;
intk=0;
floattemp=0;
//判断是否可以运算
if(A.m!=C.m||B.n!=C.n||
A.n!=B.m)
{
return-1;
}
//运算
for(i=0;i<C.m;i++)
{
for(j=0;j<C.n;j++)
{
temp=0;
for(k=0;k<A.n;k++)
{
temp+=A.read(i,k)*B.read(k,j);
}
C.write(i,j,temp);
}
}
return1;
}
//行列式的值,只能计算2*2,3*3
//失败返回-31415,成功返回值
publicfloatdet(ref_MatrixA)
{
floatvalue=0;
//判断是否可以运算
if(A.m!=A.n||(A.m!=2&&A.m!=3))
{
return-31415;
}
//运算
if(A.m==2)
{
value=A.read(0,0)*A.read(1,1)-A.read(0,1)*A.read(1,0);
}
else
{
value=A.read(0,0)*A.read(1,1)*A.read(2,2)+
A.read(0,1)*A.read(1,2)*A.read(2,0)+
A.read(0,2)*A.read(1,0)*A.read(2,1)-
A.read(0,0)*A.read(1,2)*A.read(2,1)-
A.read(0,1)*A.read(1,0)*A.read(2,2)-
A.read(0,2)*A.read(1,1)*A.read(2,0);
}
returnvalue;
}
//求转置矩阵,B=AT
//成功返回1,失败返回-1
publicinttranspos(ref_MatrixA,ref_MatrixB)
{
inti=0;
intj=0;
//判断是否可以运算
if(A.m!=B.n||A.n!=B.m)
{
return-1;
}
//运算
for(i=0;i<B.m;i++)
{
for(j=0;j<B.n;j++)
{
B.write(i,j,A.read(j,i));
}
}
return1;
}
//求逆矩阵,B=A^(-1)
//成功返回1,失败返回-1
publicintinverse(ref_MatrixA,ref_MatrixB)
{
inti=0;
intj=0;
intk=0;
_Matrixm=new_Matrix(A.m,2*A.m);
floattemp=0;
floatb=0;
//判断是否可以运算
if(A.m!=A.n||B.m!=B.n||A.m!=B.m)
{
return-1;
}
/*
//如果是2维或者3维求行列式判断是否可逆
if(A.m==2||A.m==3)
{
if(det(A)==0)
{
return-1;
}
}
*/
//增广矩阵m=A|B初始化
m.init_matrix();
for(i=0;i<m.m;i++)
{
for(j=0;j<m.n;j++)
{
if(j<=A.n-1)
{
m.write(i,j,A.read(i,j));
}
else
{
if(i==j-A.n)
{
m.write(i,j,1);
}
else
{
m.write(i,j,0);
}
}
}
}
//高斯消元
//变换下三角
for(k=0;k<m.m-1;k++)
{
//如果坐标为k,k的数为0,则行变换
if(m.read(k,k)==0)
{
for(i=k+1;i<m.m;i++)
{
if(m.read(i,k)!=0)
{
break;
}
}
if(i>=m.m)
{
return-1;
}
else
{
//交换行
for(j=0;j<m.n;j++)
{
temp=m.read(k,j);
m.write(k,j,m.read(k+1,j));
m.write(k+1,j,temp);
}
}
}
//消元
for(i=k+1;i<m.m;i++)
{
//获得倍数
b=m.read(i,k)/m.read(k,k);
//行变换
for(j=0;j<m.n;j++)
{
temp=m.read(i,j)-b*m.read(k,j);
m.write(i,j,temp);
}
}
}
//变换上三角
for(k=m.m-1;k>0;k--)
{
//如果坐标为k,k的数为0,则行变换
if(m.read(k,k)==0)
{
for(i=k+1;i<m.m;i++)
{
if(m.read(i,k)!=0)
{
break;
}
}
if(i>=m.m)
{
return-1;
}
else
{
//交换行
for(j=0;j<m.n;j++)
{
temp=m.read(k,j);
m.write(k,j,m.read(k+1,j));
m.write(k+1,j,temp);
}
}
}
//消元
for(i=k-1;i>=0;i--)
{
//获得倍数
b=m.read(i,k)/m.read(k,k);
//行变换
for(j=0;j<m.n;j++)
{
temp=m.read(i,j)-b*m.read(k,j);
m.write(i,j,temp);
}
}
}
//将左边方阵化为单位矩阵
for(i=0;i<m.m;i++)
{
if(m.read(i,i)!=1)
{
//获得倍数
b=1/m.read(i,i);
//行变换
for(j=0;j<m.n;j++)
{
temp=m.read(i,j)*b;
m.write(i,j,temp);
}
}
}
//求得逆矩阵
for(i=0;i<B.m;i++)
{
for(j=0;j<B.m;j++)
{
B.write(i,j,m.read(i,j+m.m));
}
}
//释放增广矩阵
m.free_matrix();
return1;
}
};
namespacetest
{
publicpartialclassForm1:Form
{
doublezk;
doublexkg,pkg,kk,xk,pk,q,r;
publicForm1()
{
InitializeComponent();
xk=0;
pk=0;
q=0.00001;
r=0.0001;
inti=0;
intj=0;
intk=0;
_Matrix_Calcm_c=new_Matrix_Calc();
//_Matrixm1=new_Matrix(3,3);
//_Matrixm2=new_Matrix(3,3);
//_Matrixm3=new_Matrix(3,3);
_Matrixm1=new_Matrix(2,2);
_Matrixm2=new_Matrix(2,2);
_Matrixm3=new_Matrix(2,2);
//初始化内存
m1.init_matrix();
m2.init_matrix();
m3.init_matrix();
//初始化数据
k=1;
for(i=0;i<m1.m;i++)
{
for(j=0;j<m1.n;j++)
{
m1.write(i,j,k++);
}
}
for(i=0;i<m2.m;i++)
{
for(j=0;j<m2.n;j++)
{
m2.write(i,j,k++);
}
}
m_c.multiply(refm1,refm2,refm3);
//output.Text=Convert.ToString(m3.read(1,1));
output.Text=Convert.ToString(m_c.det(refm1));
}
/*
privatevoidbutton1_Click(objectsender,EventArgse)
{
zk=Convert.ToDouble(input.Text);
//时间方程
xkg=xk;
pkg=pk+q;
//状态方程
kk=pkg/(pkg+r);
xk=xkg+kk*(zk-xkg);
pk=(1-kk)*pkg;
//输出
output.Text=Convert.ToString(xk);
}
privatevoidtextBox1_TextChanged(objectsender,EventArgse)
{
}
**/
}
}
希望本文所述对大家的C#程序设计有所帮助。