C-矩阵基本运算代码_第1页
C-矩阵基本运算代码_第2页
C-矩阵基本运算代码_第3页
C-矩阵基本运算代码_第4页
C-矩阵基本运算代码_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

©#矩阵的运算代码#region矩阵运算///<summary>〃/矩阵对应行列式的值///</summary>///<param></param>///<returns></returns>privatedoubleMatrixValue(double[,]MatrixList)(intLevel=MatrixList.GetLength(1);double[,]dMatrix=newdouble[Level,Level];for(inti=0;i<Level;i++)(for(intj=0;j<Level;j++)(dMatrix[i,j]=MatrixList[i,j];))intsign=1;for(inti=0,j=0;i<Level&&j<Level;i++,j++)(〃判断改行dMatrix[i,j]是否为0,若是,则寻找i后的行(m,m>i,切dMatrix[m,j]!=0)进行交换if(dMatrix[i,j]==0)(if(i==Level-1)(return0;)intm=i+1;〃获取一个dMatrix[m,j]不为为0的行for(;dMatrix[m,j]==0;m++)(if(m==Level-1)(return0;))//判断是否达到矩阵的最大行,若是,则返回0〃把i行和m行调换doubletemp;for(intn=j;n<Level;n++)(temp=dMatrix[i,n];dMatrix[i,n]=dMatrix[m,n];dMatrix[m,n]=temp;sign*=(-1);//把当前行以后的行所对应的列变成0doubletmp;for(ints=Level-1;s>i;s--)tmp=dMatrix[s,j];//j行后面的所有行for(intt=j;t<Level;t++)'…";doubleresult=1;for(inti=0;i<Level;i++)if(dMatrix[i,i]!=0)result*=dMatrix[i,i];elsereturn0;returnsign*result;///<summary>///矩阵减法///</summary>///<param></param>///<param></param>///<param></param>///<param></param>privatedouble[]SubMatrix(double[]A1,double[]A2)//判断矩阵的长短是否一致inta1=A1.GetLength(0);inta2=A2.GetLength(0);if(a1!=a2)(returnnull;)〃矩阵相减double[]B=newdouble[a1];for(inti=0;i<a1;i++)(B[i]=A1[i]-A2[i];)returnB;)///<summary>///矩阵乘法///</summary>///<param></param>///<param></param>///<returns></returns>privatedouble[,]MultiplyMatrix(double[,]firstMatrix,double[,]secondMatrix)(double[,]resultMatrix=newdouble[firstMatrix.GetLength(0),secondMatrix.GetLength(1)];〃判断相乘矩阵是否合法,即第一个矩阵的列要等于第二个矩阵的行if(firstMatrix.GetLength(1)!=secondMatrix.GetLength(0))(returnnull;)//求结果矩阵for(introwIndex=0;rowIndex<firstMatrix.GetLength(0);rowIndex++)(for(intcolIndex=0;colIndex<secondMatrix.GetLength(1);colIndex++)(〃初始化结果矩阵的元素resultMatrix[rowIndex,colIndex]=0;for(inti=0;i<firstMatrix.GetLength(1);i++)(//求结果矩阵的元素值resultMatrix[rowIndex,colIndex]+=firstMatrix[rowIndex,i]*secondMatrix[i,colIndex];)))returnresultMatrix;)///<summary>///求逆矩阵///</summary>III<param></param>///<returns></returns>privatedouble[,]Athwart(double[,]dMatrix)〃获取矩阵的行数intLevel=dMatrix.GetLength(l);double[,]dReverseMatrix=newdouble[Level,2*Level];//初始化矩阵Levelx(2*Level)for(inti=0;i<Level;i++)for(intj=0;j<2*Level;j++)if(j<Level)dReverseMatrix[i,j]=dMatrix[i,j];elseif(j-Level==i)dReverseMatrix[i,j]=1;else丁…。for(inti=0,j=0;i<Level&&j<Level;i++,j++)if(dReverseMatrix[i,j]==0)if(i==Level-1)returnnull;intm=i+1;for(;dMatrix[m,j]==0;m++)if(m==Level-1)returnnull;if(m==Level)returnnull;else〃把i行和m行相加for(intn=j;n<2*Level;n++) doubletemp=dReverseMatrix[i,j];if(temp!=1)〃把i行数据,变成以1开始的一行数据for(intn=j;n<2*Level;n++)if(dReverseMatrix[i,n]!=0)di…心〃把i行后的所有行的j列变成0for(ints=Level-1;s>i;s--)temp=dReverseMatrix[s,j];for(intt=j;t<2*Level;t++)[—〃把矩阵Levelx(2*Level)前LevelxLevel转变为单位矩阵for(inti=Level-2;i>=0;i--)for(intj=i+1;j<Level;j++)if(dReverseMatrix[i,j]!=0)(doubletmp=dReverseMatrix[i,j];for(intn=j;n<2*Level;n++)(dReverseMatrix[i,n]-=(tmp*dReverseMatrix[j,n])))))//返回逆矩阵double[,]dReturn=newdouble[Level,Level];for(inti=0;i<Level;i++)for(intj=0;j<Level;j++)dReturn[i,j]=dReverseMatrix[i,j+Level];returndReturn;)#endregion第二份:usingSystem;usingSystem.IO;usingSystem.Diagnostics;6namespaceAdjust7日田{8韩///<summary>9I///Matrix的摘要说明id///实现矩阵的基本运算11卜///</summary>121publicclassMatrix13中申(1415I〃构造方阵161publicMatrix(introw)17中申(181m_data=newdouble[row,row];1920卜)21IpublicMatrix(introw,intcol)22中申(231m_data=newdouble[row,col];24卜)25I〃复制构造函数261publicMatrix(Matrixm)27中申(281introw=m.Row;291intcol=m.Col;301m_data=newdouble[row,col];31321for(inti=0;i<row;i++)331for(intj=0;j<col;j++)341m_data[i,j]=m[i,j];3536卜)3738中申/*I〃分配方阵的大小I〃对于已含有内存的矩阵,将清空数据IpublicvoidSetSize(introw)I(431m_data=newdouble[row,row];441)4546I〃分配矩阵的大小〃对于已含有内存的矩阵,将清空数据491publicvoidSetSize(introw,intcol)501{Im_data=newdouble[row,col];I)卜*/54551//unitmatrix:设为单位阵561publicvoidSetUnit()57中申{581for(inti=0;i<m_data.GetLength(0);i++)591for(intj=0;j<m_data.GetLength(1);j++)601m_data[i,j]=((i==j)?1:0);61卜)62631〃设置元素值641publicvoidSetValue(doubled)65中申{661for(inti=0;i<m_data.GetLength(0);i++)671for(intj=0;j<m_data.GetLength(1);j++)681m_data[i,j]=d;69卜)7071I//Valueextraction:返中行数721publicintRow73申申{741get75中申{76returnm_data.GetLength(0);78卜)79卜)8081I〃返回列数821publicintCol83中申(841get85申申{861returnm_data.GetLength(1);87卜)88卜)8990I〃重载索引91〃存取数据成员921publicdoublethis[introw,intcol]93中申{941get95申申{961returnm_data[row,col];97卜)981set99中申(100Im_data[row,col]=value;101卜}102卜}103104I//primarychange1051//初等变换对调两行:ri<-->rj106IpublicMatrixExchange(inti,intj)107申申{108Idoubletemp;109110Ifor(intk=0;k<Col;k++)111中申{112Itemp=m_data[i,k];113Im_data[i,k]=m_data[j,k];114Im_data[j,k]=temp;115卜}1161returnthis;117卜}118119120I〃初等变换第index行乘以mul121IMatrixMultiple(intindex,doublemul)122中申(1231for(intj=0;j<Col;j++)124申申{125Im_data[index,j]*=mul;126卜}127Ireturnthis;128卜}129130131I〃初等变换第src行乘以mul加到第index行132IMatrixMultipleAdd(intindex,intsrc,doublemul)133中申{134Ifor(intj=0;j<Col;j++)135中申{136Im_data[index,j]+=m_data[src,j]*mul;137卜}138139Ireturnthis;140卜}141142I//transpose转置143IpublicMatrixTranspose()144中申(145IMatrixret=newMatrix(Col,Row);146147Ifor(inti=0;i<Row;i++)148Ifor(intj=0;j<Col;j++)149中申(150Iret[j,i]=m_data[i,j];151卜}152Ireturnret;153卜}154155I//binaryaddition矩阵力口156IpublicstaticMatrixoperator+(Matrixlhs,Matrixrhs)157中申{158Iif(lhs.Row!=rhs.Row)〃异常159中申{160ISystem.Exceptione=newException("相加的两个矩阵的行数不等");161Ithrowe;162卜}163Iif(lhs.Col!=rhs.Col)//异常164中申{ISystem.Exceptione=newException("相加的两个矩阵的歹ij数不等");Ithrowe;卜)168169Iintrow=lhs.Row;170Iintcol=lhs.Col;171IMatrixret=newMatrix(row,col);172173Ifor(inti=0;i<row;i++)174Ifor(intj=0;j<col;j++)175中申{176Idoubled=lhs[i,j]+rhs[i,j];177Iret[i,j]=d;178卜}179Ireturnret;180181卜}182183I//binarysubtraction矩阵减184IpublicstaticMatrixoperator-(Matrixlhs,Matrixrhs)185中申{186Iif(lhs.Row!=rhs.Row)〃异常187中申(188ISystem.Exceptione=newException("相减的两个矩阵的行数不等");189Ithrowe;190卜}191Iif(lhs.Col!=rhs.Col)〃异常192中申(193ISystem.Exceptione=newException("相减的两个矩阵的列数不等");194Ithrowe;195卜}196197Iintrow=lhs.Row;198Iintcol=lhs.Col;199IMatrixret=newMatrix(row,col);200201Ifor(inti=0;i<row;i++)202Ifor(intj=0;j<col;j++)203中申(204Idoubled=lhs[i,j]-rhs[i,j];205Iret[i,j]=d;206卜}207Ireturnret;208卜)209210211I//binarymultiple矩阵乘212IpublicstaticMatrixoperator*(Matrixlhs,Matrixrhs)213中年{214Iif(lhs.Col!=rhs.Row)〃异常215中申{216ISystem.Exceptione=newException。,相乘的两个矩阵的行歹ij数不匹配");217Ithrowe;218卜)219220IMatrixret=newMatrix(lhs.Row,rhs.Col);221Idoubletemp;222Ifor(inti=0;i<lhs.Row;i++)223中申{224Ifor(intj=0;j<rhs.Col;j++)225中申{226Itemp=0;227Ifor(intk=0;k<lhs.Col;k++)228中申{229Itemp+=lhs[i,k]*rhs[k,j];230卜)231Iret[i,j]=temp;232卜}233卜}234235Ireturnret;236卜}237238239I//binarydivision矩阵除240IpublicstaticMatrixoperator/(Matrixlhs,Matrixrhs)241中申(242Ireturnlhs*rhs.Inverse();243卜}244245I//unaryaddition单目加246IpublicstaticMatrixoperator+(Matrixm)247中申(248IMatrixret=newMatrix(m);249Ireturnret;250卜}251252I//unarysubtraction单目减253IpublicstaticMatrixoperator-(Matrixm)254中申(255IMatrixret=newMatrix(m);256Ifor(inti=0;i<ret.Row;i++)257Ifor(intj=0;j<ret.Col;j++)258中申(259Iret[i,j]=-ret[i,j];260卜)261262Ireturnret;263卜}264265I//numbermultiple数乘266IpublicstaticMatrixoperator*(doubled,Matrixm)267中申{268IMatrixret=newMatrix(m);269Ifor(inti=0;i<ret.Row;i++)270Ifor(intj=0;j<ret.Col;j++)271Iret[i,j]*=d;272273Ireturnret;274卜)275276I//numberdivision数除277IpublicstaticMatrixoperator/(doubled,Matrixm)278申申{279Ireturnd*m.Inverse();280卜}281282I〃功能:返回列主元素的行号2831〃参数:row为开始查找的行号2841〃说明:在行号[row,Col)范围内查找第row列中绝对值最大的元素,返回所在行号285IintPivot(introw)286中申{287Iintindex=row;288289Ifor(inti=row+1;i<Row;i++)290中申{291Iif(m_data[i,row]>m_data[index,row])292Iindex=i;293卜}294295Ireturnindex;296卜)2972981//inversion逆阵:使用矩阵的初等变换,列主元素消去法299IpublicMatrixInverse()300申申{301Iif(Row!=Col)//异常,非方阵302中申{303ISystem.Exceptione=newException("求逆的矩阵不是方阵");304Ithrowe;305卜}306IStreamWritersw=newStreamWriter("..\\annex\\close_matrix.txt");307IMatrixtmp=newMatrix(this);308IMatrixret=newMatrix(Row);//单位阵3091ret.SetUnit();310311IintmaxIndex;312IdoubledMul;313314Ifor(inti=0;i<Row;i++)315申申{316ImaxIndex=tmp.Pivot(i);317318Iif(tmp.m_data[maxlndex,i]==0)3199申(320ISystem.Exceptione=newException("求逆的矩阵的行歹ij式的值等于0,");321Ithrowe;322卜}3233241if(maxIndex!=i)//下三角阵中此列的最大值不在当前行,交换325中申(326Itmp.Exchange(i,maxIndex);327Iret.Exchange(i,maxIndex);328329卜}330331Iret.Multiple(i,1/tmp[i,i]);332333Itmp.Multiple(i,1/tmp[i,i]);334335Ifor(intj=i+1;j<Row;j++)336中申{337IdMul=-tmp[j,i]/tmp[i,i];338Itmp.MultipleAdd(j,i,dMul);339Iret.MultipleAdd(j,i,dMul);340341卜}342Isw.WriteLine("tmp=\r\n"+tmp);343Isw.WriteLine("ret=\r\n"+ret);344卜}//endfor345346347Isw.WriteLine("**=\r\n"+this*ret);348349Ifor(inti=Row-1;i>0;i--)350中申{351Ifor(intj=i-1;j>=0;j--)352中申{353IdMul=-tmp[j,i]/tmp[i,i];354Itmp.MultipleAdd(j,i,dMul);355Iret.MultipleAdd(j,i,dMul);356卜}357卜}//endfor358359360Isw.WriteLine("tmp=\r\n"+tmp);361Isw.WriteLine("ret=\r\n"+ret);362Isw.WriteLine("***=\r\n"+this*ret);363Isw.Close();364365Ireturnret;366367卜}//endInverse368369中中#region370中申/*371I//inversion逆阵:使用矩阵的初等变换,列主元素消去法372IpublicMatrixInverse()373I(374Iif(Row!=Col)〃异常,非方阵375I(376ISystem.Exceptione=newException("求逆的矩阵不是方阵");377Ithrowe;3781}379I///////////////380IStreamWritersw=newStreamWriter("..\\annex\\matrix_mul.txt");381I////////////////////382I///383IMatrixtmp=newMatrix(this);384IMatrixret=newMatrix(Row);//单位阵3851ret.SetUnit();386387IintmaxIndex;3881doubledMul;389390Ifor(inti=0;i<Row;i++)391I(392393ImaxIndex=tmp.Pivot(i);394395Iif(tmp.m_data[maxIndex,i]==0)3961{397ISystem.Exceptione=newException("求逆的矩阵的行歹ij式的值等于0,");398Ithrowe;399I)400401Iif(maxIndex!=i)〃下三角阵中此列的最大值不在当前行,交换4021{403Itmp.Exchange(i,maxIndex);404Iret.Exchange(i,maxIndex);4054061)407408Iret.Multiple(i,1/tmp[i,i]);409410I/////////////////////////411I//sw.WriteLine("nul\t"+tmp[i,i]+"\t"+ret[i,i]);412I////////////////413Itmp.Multiple(i,1/tmp[i,i]);414I//sw.WriteLine("mmm\t"+tmp[i,i]+"\t"+ret[i,i]);415Isw.WriteLine("111111111tmp=\r\n"+tmp);416Ifor(intj=i+1;j<Row;j++)417l(418IdMul=-tmp[j,i];419Itmp.MultipleAdd(j,i,dMul);420Iret.MultipleAdd(j,i,dMul);421422I}423Isw.WriteLine("222222222222=\r\n"+tmp);424425I}//endfor426427428429Ifor(inti=Row-1;i>0;i--)430I(431Ifor(intj=i-1;j>=0;j--)432I(433IdMul=-tmp[j,i];434Itmp.MultipleAdd(j,i,dMul);435Iret.MultipleAdd(j,i,dMul);4361)437I}//endfor438439I//////////////////////////440441442Isw.WriteLine("tmp=\r\n"+tmp.ToString());443444Isw.Close();445I///////////////////////////////////////446I///447Ireturnret;448449I}//endInverse450451卜*/452453卜#endregion454455I//determineifthematrixissquare:方阵456IpublicboolIsSquare()457中申(458IreturnRow==Col;459卜}460461I//determineifthematrixissymmetric对称阵462IpublicboolIsSymmetric()463中申{464465Iif(Row!=Col)466Ireturnfalse;467468Ifor(inti=0;i<Row;i++)469Ifor(intj=i+1;j<Col;j++)470Iif(m_data[i,j]!=m_data[j,i])471Ireturnfalse;472473Ireturntrue;474卜}475476I〃一阶矩阵,实数477IpublicdoubleToDouble()478中申(479ITrace.Assert(Row==1&&Col==1);480481Ireturnm_data[0,0];482卜}483484I//conerttostring485IpublicoverridestringToString()486申申{487488Istrings="";489Ifor(inti=0;i<Row;i++)490中申{491Ifor(intj=0;j<Col;j++)492Is+=string.Format("{0}",m_data[i,j]);493494Is+="\r\n";495卜}496Ireturns;497498卜}499500501 〃私有数据成员502Iprivatedouble[,]m_data;503504卜}//endclassMatrix505}///矩阵的乘publicboolMatrixMultiply(double[,]a,double。]b,refdouble。]c)(if(a.GetLength(1)!=b.GetLength(0))returnfalse;if(a.GetLength(0)!=c.GetLength(0)||b.GetLength(1)!=c.GetLength(1))returnfalse;for(inti=0;i<a.GetLength(0);i++)(for(intj=0;j<b.GetLength(1);j++)(c[i,j]=0;for(intk=0;k<b.GetLength(0);k++)(c[i,j]+=a[i,k]*b[k,j];returntrue;///矩阵的加publicboolMatrixAdd(double[,]a,double[,]b,refdouble[,]c)(if(a.GetLength(0)!=b.GetLength(0)||a.GetLength(1)!=b.GetLength(1)||a.GetLength(0)!=c.GetLength(0)||a.GetLength(1)!=c.GetLength(1))returnfalse;for(inti=0;i<a.GetLength(0);i++)(for(intj=0;j<a.GetLength(1);j++)(c[i,j]=a[i,j]+b[i,j];))returntrue;)///矩阵的减publicboolMatrixSubtration(double[,]a,double[,]b,refdouble[,]c)(if(a.GetLength(0)!=b.GetLength(0)||a.GetLength(1)!=b.GetLength(1)||a.GetLength(0)!=c.GetLength(0)||a.GetLength(1)!=c.GetLength(1))returnfalse;for(inti=0;i<a.GetLength(0);i++)(for(intj=0;j<a.GetLength(1);j++)(c[i,j]=a[i,j]-b[i,j];))returntrue;)///矩阵的行列式的值publicdoubleMatrixSurplus(double[,]a)(inti,j,k,p,r,m,n;m=a.GetLength(0);n=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论