C#矩阵运算类.docx
《C#矩阵运算类.docx》由会员分享,可在线阅读,更多相关《C#矩阵运算类.docx(11页珍藏版)》请在冰点文库上搜索。
![C#矩阵运算类.docx](https://file1.bingdoc.com/fileroot1/2023-5/14/c5134ddb-c636-4a4a-8571-b734443a1e6d/c5134ddb-c636-4a4a-8571-b734443a1e6d1.gif)
C#矩阵运算类
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
usingSystem.Collections;
publicclassMatrix
{
double[,]A;
//m行n列
intm,n;
stringname;
publicMatrix(intam,intan)
{
m=am;
n=an;
A=newdouble[m,n];
name="Result";
}
publicMatrix(intam,intan,stringaName)
{
m=am;
n=an;
A=newdouble[m,n];
name=aName;
}
publicintgetM
{
get{returnm;}
}
publicintgetN
{
get{returnn;}
}
publicdouble[,]Detail
{
get{returnA;}
set{A=value;}
}
publicstringName
{
get{returnname;}
set{name=value;}
}
}
classMatrixOperator
{
MatrixOperator()
{}
///
///矩阵加法
///
///
///
///
publicstaticMatrixMatrixAdd(MatrixMa,MatrixMb)
{
intm=Ma.getM;
intn=Ma.getN;
intm2=Mb.getM;
intn2=Mb.getN;
if((m!
=m2)||(n!
=n2))
{
ExceptionmyException=newException("数组维数不匹配");
throwmyException;
}
MatrixMc=newMatrix(m,n);
double[,]c=Mc.Detail;
double[,]a=Ma.Detail;
double[,]b=Mb.Detail;
inti,j;
for(i=0;ifor(j=0;jc[i,j]=a[i,j]+b[i,j];
returnMc;
}
///
///矩阵减法
///
///
///
///
publicstaticMatrixMatrixSub(MatrixMa,MatrixMb)
{
intm=Ma.getM;
intn=Ma.getN;
intm2=Mb.getM;
intn2=Mb.getN;
if((m!
=m2)||(n!
=n2))
{
ExceptionmyException=newException("数组维数不匹配");
throwmyException;
}
MatrixMc=newMatrix(m,n);
double[,]c=Mc.Detail;
double[,]a=Ma.Detail;
double[,]b=Mb.Detail;
inti,j;
for(i=0;ifor(j=0;jc[i,j]=a[i,j]-b[i,j];
returnMc;
}
///
///矩阵打印
///
///
///
publicstaticstringMatrixPrint(MatrixMa)
{
strings;
s=Ma.Name+":
\n";
intm=Ma.getM;
intn=Ma.getN;
double[,]a=Ma.Detail;
for(inti=0;i{
for(intj=0;j{
s+=a[i,j].ToString("0.0000")+"\t";
}
s+="\n";
}
returns;
}
///
///矩阵乘法
///
///
///
///
publicstaticMatrixMatrixMulti(MatrixMa,MatrixMb)
{
intm=Ma.getM;
intn=Ma.getN;
intm2=Mb.getM;
intn2=Mb.getN;
if(n!
=m2)
{
ExceptionmyException=newException("数组维数不匹配");
throwmyException;
}
MatrixMc=newMatrix(m,n2);
double[,]c=Mc.Detail;
double[,]a=Ma.Detail;
double[,]b=Mb.Detail;
inti,j,k;
for(i=0;ifor(j=0;j{
c[i,j]=0;
for(k=0;kc[i,j]+=a[i,k]*b[k,j];
}
returnMc;
}
///
///矩阵数乘
///
///
///
///
publicstaticMatrixMatrixSimpleMulti(doublek,MatrixMa)
{
intn=Ma.getN;
intm=Ma.getM;
MatrixMc=newMatrix(m,n);
double[,]c=Mc.Detail;
double[,]a=Ma.Detail;
inti,j;
for(i=0;ifor(j=0;jc[i,j]=a[i,j]*k;
returnMc;
}
///
///矩阵转置
///
///
///
///
publicstaticMatrixMatrixTrans(MatrixMa)
{
intm=Ma.getM;
intn=Ma.getN;
MatrixMc=newMatrix(n,m);
double[,]c=Mc.Detail;
double[,]a=Ma.Detail;
for(inti=0;ifor(intj=0;jc[i,j]=a[j,i];
returnMc;
}
///
///矩阵求逆(高斯法)
///
///
///
publicstaticMatrixMatrixInv(MatrixMa)
{
intm=Ma.getM;
intn=Ma.getN;
if(m!
=n)
{
ExceptionmyException=newException("数组维数不匹配");
throwmyException;
}
MatrixMc=newMatrix(m,n);
double[,]a0=Ma.Detail;
double[,]a=(double[,])a0.Clone();
double[,]b=Mc.Detail;
inti,j,row,k;
doublemax,temp;
//单位矩阵
for(i=0;i{
b[i,i]=1;
}
for(k=0;k{
max=0;row=k;
//找最大元,其所在行为row
for(i=k;i{
temp=Math.Abs(a[i,k]);
if(max{
max=temp;
row=i;
}
}
if(max==0)
{
ExceptionmyException=newException("没有逆矩阵");
throwmyException;
}
//交换k与row行
if(row!
=k)
{
for(j=0;j{
temp=a[row,j];
a[row,j]=a[k,j];
a[k,j]=temp;
temp=b[row,j];
b[row,j]=b[k,j];
b[k,j]=temp;
}
}
//首元化为1
for(j=k+1;jfor(j=0;ja[k,k]=1;
//k列化为0
//对a
for(j=k+1;j{
for(i=0;ifor(i=k+1;i}
//对b
for(j=0;j{
for(i=0;ifor(i=k+1;i}
for(i=0;ia[k,k]=1;
}
returnMc;
}
///
///矩阵求逆(伴随矩阵法)
///
///
///
publicstaticMatrixMatrixInvByCom(MatrixMa)
{
doubled=MatrixOperator.MatrixDet(Ma);
if(d==0)
{
ExceptionmyException=newException("没有逆矩阵");
throwmyException;
}
MatrixAx=MatrixOperator.MatrixCom(Ma);
MatrixAn=MatrixOperator.MatrixSimpleMulti((1.0/d),Ax);
returnAn;
}
///
///对应行列式的代数余子式矩阵
///
///
///
publicstaticMatrixMatrixSpa(MatrixMa,intai,intaj)
{
intm=Ma.getM;
intn=Ma.getN;
if(m!
=n)
{
ExceptionmyException=newException("数组维数不匹配");
throwmyException;
}
intn2=n-1;
MatrixMc=newMatrix(n2,n2);
double[,]a=Ma.Detail;
double[,]b=Mc.Detail;
//左上
for(inti=0;ifor(intj=0;j{
b[i,j]=a[i,j];
}
//右下
for(inti=ai;ifor(intj=aj;j{
b[i,j]=a[i+1,j+1];
}
//右上
for(inti=0;ifor(intj=aj;j{
b[i,j]=a[i,j+1];
}
//左下
for(inti=ai;ifor(intj=0;j{
b[i,j]=a[i+1,j];
}
//符号位
if((ai+aj)%2!
=0)
{
for(inti=0;ib[i,0]=-b[i,0];
}
returnMc;
}
///
///矩阵的行列式
///
///
///
publicstaticdoubleMatrixDet(MatrixMa)
{
intm=Ma.getM;
intn=Ma.getN;
if(m!
=n)
{
ExceptionmyException=newException("数组维数不匹配");
throwmyException;
}
double[,]a=Ma.Detail;
if(n==1)returna[0,0];
doubleD=0;
for(inti=0;i{
D+=a[1,i]*MatrixDet(MatrixSpa(Ma,1,i));
}
returnD;
}
///
///矩阵的伴随矩阵
///
///
///
publicstaticMatrixMatrixCom(MatrixMa)
{
intm=Ma.getM;
intn=Ma.getN;
MatrixMc=newMatrix(m,n);
double[,]c=Mc.Detail;
double[,]a=Ma.Detail;
for(inti=0;ifor(intj=0;jc[i,j]=MatrixDet(MatrixSpa(Ma,j,i));
returnMc;
}
}