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#程序设计有所帮助。