您好,欢迎访问三七文档
在研究工作中经常需要用到关于矩阵的各种运算,如果每当需要使用,就临时编写,就会特别费时费力。这里将常见的矩阵计算算法做成“头文件+源文件”,日后需要使用,直接复制到文件目录下,在引用就可以了。(Matrix.h)#includevectorusingstd::vector;classMatrix{public:Matrix(intm,intn){row=m;col=n;vectorvectordoubleB(m,vectordouble(n));//定义一个m行n列的double型数组。A=B;}public:introw;intcol;vectorvectordoubleA;};MatrixMatrixAdd(MatrixM1,MatrixM2);//矩阵相加MatrixMatrixSub(MatrixM1,MatrixM2);//矩阵相减MatrixMatrixMulti(MatrixM1,MatrixM2);//矩阵相乘MatrixMatrixSimpleMulti(intk,MatrixM1);//矩阵数乘MatrixMatrixTrans(MatrixM1);//矩阵转置MatrixMatrixInv(MatrixMa);//矩阵求逆MatrixMatrixYuzishi(MatrixMa,intr,intc);//求矩阵的余子式doubledet(MatrixM1,intn1);//求矩阵行列式(Matrix.cpp)#includestdafx.h#includeMatrix.h#includemath.h/////////////////////////////矩阵相加///////////////////////////////////MatrixMatrixAdd(MatrixM1,MatrixM2){intm1=M1.row;intn1=M1.col;intm2=M2.row;intn2=M2.col;//获得矩阵的行列数量//if((m1!=m2)||(n1!=n2))//{////注意学习C++如何抛出异常,以后补上。//}MatrixMc(m1,n1);vectorvectordouble&c=Mc.A;vectorvectordouble&a=M1.A;vectorvectordouble&b=M2.A;//这里一定要注意按地址传递或者传引用,否则在调用函数时就不能得出正确结果。for(inti=0;im1;i++){for(intj=0;jn1;j++){c[i][j]=a[i][j]+b[i][j];}}returnMc;}/////////////////////////////矩阵相减///////////////////////////////////MatrixMatrixSub(MatrixM1,MatrixM2){intm1=M1.row;intn1=M1.col;intm2=M2.row;intn2=M2.col;//获得矩阵的行列数量//if((m1!=m2)||(n1!=n2))//{////注意学习C++如何抛出异常,以后补上。//}MatrixMc(m1,n1);vectorvectordouble&c=Mc.A;vectorvectordouble&a=M1.A;vectorvectordouble&b=M2.A;//这里一定要注意按地址传递或者传引用,否则在调用函数时就不能得出正确结果。for(inti=0;im1;i++){for(intj=0;jn1;j++){c[i][j]=a[i][j]-b[i][j];}}returnMc;}/////////////////////////////矩阵相乘///////////////////////////////////MatrixMatrixMulti(MatrixM1,MatrixM2){intm1=M1.row;intn1=M1.col;intm2=M2.row;intn2=M2.col;//获得矩阵的行列数量//判断M1,M2是否可以相乘MatrixMc(m1,n2);vectorvectordouble&c=Mc.A;vectorvectordouble&a=M1.A;vectorvectordouble&b=M2.A;//这里一定要注意按地址传递或者传引用,否则在调用函数时就不能得出正确结果。for(inti=0;im1;i++){for(intj=0;jn2;j++){c[i][j]=0;for(intk=0;kn2;k++){c[i][j]+=a[i][k]*b[k][j];}}}returnMc;}/////////////////////////////矩阵数乘///////////////////////////////////MatrixMatrixSimpleMulti(intk,MatrixM1){intm=M1.row;intn=M1.col;MatrixMc(m,n);vectorvectordouble&c=Mc.A;vectorvectordouble&a=M1.A;for(inti=0;im;i++){for(intj=0;jn;j++){c[i][j]=k*a[i][j];}}returnMc;}/////////////////////////////矩阵转置///////////////////////////////////MatrixMatrixTrans(MatrixM1){intm=M1.row;intn=M1.col;MatrixMc(n,m);vectorvectordouble&c=Mc.A;vectorvectordouble&a=M1.A;for(inti=0;in;i++){for(intj=0;jm;j++){c[i][j]=a[j][i];}}returnMc;}/////////////////////////////矩阵求逆///////////////////////////////////MatrixMatrixInv(MatrixMa){intm=Ma.row;intn=Ma.col;MatrixMc(m,n);vectorvectordouble&a0=Ma.A;vectorvectordoublea=a0;vectorvectordouble&b=Mc.A;inti,j,R,k;doublemax,temp;//定义一个单位阵for(i=0;in;i++){b[i][i]=1;}for(k=0;kn;k++){max=0;R=k;//寻找主元,并记录其行号Rfor(i=k;in;i++){temp=abs(a[i][k]);if(maxtemp){max=temp;R=i;}}//if(max==0)//如果主元为零,则表示矩阵为奇异阵,不可逆//{//}//交换k与R行if(R!=k){for(j=0;jn;j++){temp=a[R][j];a[R][j]=a[k][j];a[k][j]=temp;temp=b[R][j];b[R][j]=b[k][j];b[k][j]=temp;}}//将主元变为1for(j=k+1;jn;j++){a[k][j]/=a[k][k];}for(j=0;jn;j++){b[k][j]/=a[k][k];}a[k][k]=1;//k列化为0//对a矩阵for(j=k+1;jn;j++){for(i=0;ik;i++){a[i][j]-=a[i][k]*a[k][j];}for(i=k+1;in;i++){a[i][j]-=a[i][k]*a[k][j];}}//对b矩阵for(j=0;jn;j++){for(i=0;ik;i++){b[i][j]-=a[i][k]*b[k][j];}for(i=k+1;in;i++){b[i][j]-=a[i][k]*b[k][j];}}for(i=0;in;i++){a[i][k]=0;}a[k][k]=1;}returnMc;}/////////////////////////////矩阵行列式/////////////////////////////////doubledet(MatrixM1,intn1)//n1为矩阵M1的阶数{inti_1,j_1,c;Matrixb(n1,n1);intp=0,q=0;doublesum=0;if(n1==1)returnM1.A[0][0];for(i_1=0;i_1n1;i_1++){for(c=0;cn1-1;c++){if(ci_1)p=0;elsep=1;for(j_1=0;j_1n1-1;j_1++){b.A[c][j_1]=M1.A[c+p][j_1+1];}}if(i_1%2==0)q=1;elseq=(-1);sum+=M1.A[i_1][0]*q*det(b,n1-1);}returnsum;}/////////////////////////////矩阵余子式/////////////////////////////////MatrixMatrixYuzishi(MatrixMa,intr,intc){intm=Ma.row-1;MatrixMc(m,m);vectorvectordoubleaaa;for(inti=0;iMa.row;i++){for(intj=0;jMa.row;j++){if(j==c){autoit=Ma.A[i].begin();//对于A的一次维度,他存储的是一个个vector,则可以对他的每一个一维元素进行所有的vector操作。Ma.A[i].erase(it+j);}}if(i!=r){aaa.push_back(Ma.A[i]);}}Mc.A=aaa;returnMc;}(Demo.cpp)//以求余子式为例,说明各个函数的使用方法。//Demo.cpp:定义控制台应用程序的入口点。#includestdafx.h#includeiostreamusingnamespacestd;#includeMatrix.hint_tmain(intargc,_TCHAR*argv[]){Matrixa(3,3);vectorvectordoubleM1(3,vectordouble(3));for(inti=0;i3;i++){for(intj=0;j3;j++){if(i==j){M1[i][j]=2;}else{M1[i][j]=0;//词句也可不写,因为系统会默认为0}}}a.A=M1;couta矩阵:endl;for(inti=0;i3;i++){for(intj=0;j3;j++){couta.A[i][j]\t;}coutendl;}Matrixyu=MatrixYuzishi(a,2,2);coutyu.rowendl;coutyu.colendl;for(inti=0;i2;i++){for(intj=0;j2;j++){coutyu.A[i][j]\t;}coutendl;}return0;}
本文标题:矩阵运算C++模块
链接地址:https://www.777doc.com/doc-2175080 .html