




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
矩阵类文档及函数(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)
matrix类矩阵类文档及函数(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)简要描述:matrix类顾名思义也就是矩阵类,它主要用于支持项目中用到的与矩阵相关的运算,采用包含头文件得方式引用。使用方法:1.将该类所属的三个文件:matrix.h,matrix.cpp,mymath.h拷贝到用户主程序所在目录下;2.在用户要调用的文件头写下:#include“matrix.h”3.在用户想要定义矩阵的地方写下如下语句:matrixA,B(2,2),C(3,4,’R’),D(4,2,’C’),E(1,10,’L’)这样就定义了五个矩阵对象;4.在定义得对象后按照C++标准的引用方式就可以使用矩阵类的所用功能;(祥见功能列表)5.释放矩阵空间,例如:A.ReleaseSpace()。成员变量列表:函数名称矩阵行矩阵列实矩阵指针复矩阵指针字符矩阵指针函数代码标志introwintcolumndoublemat_adComplexNumatcplx_adcharch_ad属性privateprivateprivateprivateprivate描述矩阵特性,函数获取矩阵特性,函数获取实矩阵数据存放首地址复矩阵数据存放首地址字符矩阵数据存放首地址功能列表:变量名称构造函数1构造函数2构造函数3析构函数获取行函数获取列函数变量代码标志matrix()matrix(intm,intn)matrix(intm,intn,charp)~matrix()intGetRow()intGetColumn()描述无形参情况下,初始化矩阵对象双输入时默认创建实矩阵按照指定类型大小创建矩阵对象消失时相关操作从外部获取私有变量row从外部获取私有变量column若矩阵为实矩阵,获取实获取实矩阵指针函数double*GetMat()矩阵首地址,其他时候返回NULL若矩阵为复矩阵,获取复ComplexNum获取复矩阵指针函数矩阵首地址,其他时候返*GetMatCplx()回NULL若矩阵为字符矩阵,获取获取字符矩阵指针函数char*GetMatChar()字符矩阵首地址,其他时候返回NULLvoidCreatMat(intm,int在任意位置,创建一个指矩阵创建函数n,charp)定类型大小的矩阵在任意位置重新指定矩矩阵行设置行数voidSetColumn(intm)阵的行数在任意位置重新指定矩矩阵列设置函数voidSetRow(intn)阵的列数voidSetDataAD(double在任意位置重新指定矩设置实指针函数*p)阵实指针指向Void在任意位置重新指定矩设置复指针函数SetDataAD(ComplexNum阵复指针指向*p)voidSetElement(double在任意位置重新实矩阵设置元素函数1x,intm,intn)给定指定元素值void在任意位置重新复矩阵设置元素函数2SetElement(ComplexNum给定指定元素值x,intm,intn)单位阵函数矩阵赋值函数1矩阵赋值函数2矩阵赋值函数3矩阵加法函数矩阵减法函数矩阵乘法函数1矩阵乘法函数2矩阵求逆函数矩阵复制函数矩阵转置函数获取矩阵元素函数1获取矩阵元素函数2水平拼接函数垂平拼接函数产生一个指定大小的单位矩阵voidAssignMat(double将一维数组赋值到指定*a,intm,intn)大小的实矩阵void将一维数组赋值到指定AssignMat(ComplexNum大小的复矩阵*a,intm,intn)voidAssignMat(char*a,int将一维数组赋值到指定m,intn)大小的字符矩阵voidMatrixAdd(matrix矩阵相加,C=A+B,外部C,matrixA,matrixB);由C引用voidMatrixSub(matrix矩阵相加,C=A-B,外部由C,matrixA,matrixB)C引用voidMatrixPlus(matrix矩阵相乘,C=A*B,外部由C,matrixA,matrixB)C引用voidMatrixPlus(matrix常数矩阵相乘,C=A*b,外C,matrixA,doubleb)部由C引用voidMatrixInv(matrix矩阵求逆,B=Inv(A),外部B,matrixA)由B引用voidMatrixCopy(matrix矩阵拷贝,B=A,外部由BB,matrixA)引用voidTranspose(matrix矩阵转置,B=A',外部由B&B,matrixA);引用voidGetElement(doublex=A[m,n]获取实矩阵指&x,intm,intn)定元素,外部由A引用voidx=A[m,n]获取复矩阵指GetElement(ComplexNum定元素,外部由A引用&x,intm,intn)void矩阵的横向链接,C=[ALevelLinkMatrix(matrixB]&C,matrixA,matrixB)void矩阵的纵向链VerticalLinkMatrix(matrix接,C=[A;B]&C,matrixA,matrixB)voidUnitMatrix(intm)voidChangeRow(matrix交换矩阵A的第m、n&B,matrixA,intm,intn)行,由B引用void交换矩阵A的第m、nChangeColumn(matrix&B,matrixA,intm,intn)列,由B引用voidRemoveRow(matrix移去A矩阵的指定行,作&B,matrixA,intdel_row)为B矩阵,由B引用行交换函数列交换函数行删除函数void移去A矩阵的指定列,作列删除函数RemoveColumn(matrix&为B矩阵,由B引用B,matrixA,intdel_column)把矩阵A指定行取出并voidGetRowVector(matrix行向量获取函数存入一个矩阵B,由B调B,matrixA,intm)用void把矩阵A指定列取出并列向量获取函数GetColumnVector(matrix存入一个矩阵B,由B调B,matrixA,intn)用求出矩阵行列式,由A行列式值函数doubleMatDet(matrixA)引用判断矩阵是否奇异,由A奇异判断函数intIsSingle(matrixA);引用voidQRReduce(matrix实矩阵QR分解函数实矩阵的基本QR分解&Q,matrix&R,matrixA)void实矩阵拟上三角化函数QuasiUpTriMat(matrix实矩阵拟上三角化&B,matrixA)voidLUReduce(matrix实矩阵LU分解函数实矩阵的LU分解&L,matrix&U,matrixA)voidEigenValue(matrix特征值求取函数实矩阵的特征值&eig,matrixA)矩阵显示函数矩阵空间释放函数voidDisplay()voidReleaseSpace()矩阵显示到屏幕释放对象的矩阵所占空间附录:源代码"matrix.h"//matrix.h:interfaceforthematrixclass.////////////////////////////////////////////////////////////////////////#include<iostream.h>#include"math.h"#include<stdlib.h>#include<stdio.h>#if!defined(AFX_MATRIX_H__D7296B39_2208_48A0_813C_B18AC9B4EA8B__INCLUDED_)#defineAFX_MATRIX_H__D7296B39_2208_48A0_813C_B18AC9B4EA8B__INCLUDED_#if_MSC_VER>1000#pragmaonce#endif//_MSC_VER>1000#ifndefMATRIX_H#defineMATRIX_H//定义一个复数结构体structComplexNum{doublere;doubleim;};//定义矩阵类classmatrix{private:introw;intcolumn;double*mat_ad;ComplexNum*matcplx_ad;char*ch_ad;public:matrix();virtual~matrix();public:matrix(intm,intn,charp);//重载矩阵构造函数,用于初始化matrix(intm,intn);//若双输入默认为使矩阵,用于初始化intGetRow(){returnrow;}//获取矩阵行intGetColumn(){returncolumn;}//获取矩阵列double*GetMat();//获取实矩阵数据首地址函数ComplexNum*GetMatCplx();//获取复矩阵数据首地址函数char*GetMatChar();//获取字符阵数据首地址函数voidCreatMat(intm,intn,charp);//创建一个指定类型的矩阵voidSetColumn(intm);//重新设置矩阵行voidSetRow(intn);//重新设置矩阵列voidSetDataAD(double*p);//重新设置实数矩阵指针地址voidSetDataAD(ComplexNum*p);//重新设置复数矩阵指针地址voidSetElement(doublex,intm,intn);//重新设置矩阵的指定元素值voidSetElement(ComplexNumx,intm,intn);//重新设置复矩阵的指定元素值voidUnitMatrix(intm);//得到一个m维单为矩阵AvoidAssignMat(double*a,intm,intn);//矩阵赋值,将一维数组赋值到实矩阵voidAssignMat(ComplexNum*a,intm,intn);//矩阵赋值,将一维数组赋值到复矩阵voidAssignMat(char*a,intm,intn);//矩阵赋值,将一维字符数组赋值到字符矩阵voidMatrixAdd(matrixC,matrixA,matrixB);//矩阵相加,C=A+B,外部由C引用voidMatrixSub(matrixC,matrixA,matrixB);//矩阵相减,C=A-B,外部由C引用voidMatrixPlus(matrixC,matrixA,matrixB);//矩阵相乘,C=A*B,外部由C引用voidMatrixPlus(matrixC,matrixA,doubleb);//常数矩阵相乘,C=A*b,外部由C引用voidMatrixInv(matrixB,matrixA);//矩阵求逆,B=Inv(A),外部由B引用voidMatrixCopy(matrixB,matrixA);//矩阵拷贝,B=A,外部由B引用voidTranspose(matrix&B,matrixA);//矩阵转置,B=A',外部由B引用voidGetElement(double&x,intm,intn);//把矩阵的m行,n列的元素取出来,由A操作voidGetElement(ComplexNum&x,intm,intn);//把矩阵的m行,n列的元素取出来,由A操作voidLevelLinkMatrix(matrix&C,matrixA,matrixB);//矩阵的横向链接,C=[AB]doubleMatDet(matrixA);//求出矩阵行voidVerticalLinkMatrix(matrix&C,matrixA,matrixB);//矩阵的纵向链列式接,C=[A;B]boolIsSingle(matrixA);//判断矩阵是否奇异voidChangeRow(matrix&B,matrixA,intm,intn);//交换矩阵A的第m、n行voidQRReduce(matrix&Q,matrix&R,matrixA);//实矩阵的基本QR分解voidChangeColumn(matrix&B,matrixA,intm,intn);//交换矩阵A的第m、n列voidRemoveRow(matrix&B,matrixA,intdel_row);//移去A矩阵的指定行,作为B矩阵B,matrixA,intdel_column);//移去矩阵的指定列,作为B矩阵voidGetRowVector(matrix&B,matrixA,intm);//把矩阵A指定行取出并存入一个矩阵B,由B调用void&B,matrixA,intn);//把矩阵A指定列取出并存入一个矩阵B,由B调用"mymath.h"#include"matrix.h"//符号函数doublesgn(doublex){if(x>0)return(1);elsereturn(-1);}//求二维矩阵的特征值和特征方程的系数&s2,double*A){doublea,delta;a=1;voidQuasiUpTriMat(matrix&B,matrixA);//实矩阵拟上三角化voidLUReduce(matrix&L,matrix&U,matrixA);//实矩阵的LU分解voidEigenValue(matrix&eig,matrixA);//实矩阵的特征值voidDisplay();//矩阵显示到屏幕voidReleaseSpace();//释放对象};#endif//!defined(AFX_MATRIX_H__D7296B39_2208_48A0_813C_B18AC9B4EA8B__INCLUDED_)#endifb=-1*(A[0]+A[3]);c=A[0]*A[3]-A[1]*A[2];delta=(b*b-4*a*c);if(delta>=0){s1.re=(-1*b+sqrt(delta))/(2*a);s1.im=0;s2.re=(-1*b-sqrt(delta))/(2*a);s2.im=0;}else{s1.re=-1*b/(2*a);s1.im=sqrt(-1*delta)/(2*a);s2.re=-1*b/(2*a);s2.im=-1*sqrt(-1*delta)/(2*a);}}"matrix.cpp"//matrix.cpp:implementationofthematrixinti=0;class.////////////////////////////////////////////////////////////////////////#include"mymath.h"#include"matrix.h"////////////////////////////////////////////////////////////////////////Construction/Destruction////////////////////////////////////////////////////////////////////////无形参构造函数matrix::matrix(){row=0;column=0;mat_ad=NULL;matcplx_ad=NULL;ch_ad=NULL;}//若双输入默认为使矩阵,用于初始化matrix::matrix(intm,intn){inti=0;row=m;column=n;mat_ad=(double*)malloc(sizeof(double)*m*n);for(i=0;i<m*n;i++){mat_ad[i]=0;}matcplx_ad=NULL;ch_ad=NULL;}//指定行列数,并分配相应空间的零初始化构造函数matrix::matrix(intm,intn,charp){mat_ad=NULL;matcplx_ad=NULL;if((p=='r')||(p=='R')){row=m;column=n;mat_ad=(double*)malloc(sizeof(double)*m*n);for(i=0;i<m*n;i++){mat_ad[i]=0;}matcplx_ad=NULL;ch_ad=NULL;}elseif((p=='c')||(p=='C')){row=m;column=n;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*m*n);for(i=0;i<m*n;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;ch_ad=NULL;}elseif((p=='l')||(p=='L')){row=m;column=n;ch_ad=(char*)malloc(sizeof(char)*m*n);for(i=0;i<m*n;i++){ch_ad[i]=0;}matcplx_ad=NULL;mat_ad=NULL;}else{cout<<"未知类型,请输入c或r"<<endl;}}//析构函数matrix::~matrix(){//free(mat_ad);}//创建一个指定类型的矩阵voidmatrix::CreatMat(intm,intn,charp){inti=0;mat_ad=NULL;matcplx_ad=NULL;ch_ad=NULL;if((p=='r')||(p=='R')){row=m;column=n;mat_ad=(double*)malloc(sizeof(double)*m*n);for(i=0;i<m*n;i++){mat_ad[i]=0;}}elseif((p=='c')||(p=='C')){row=m;column=n;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*m*n);for(i=0;i<m*n;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}}elseif((p=='l')||(p=='L')){row=m;column=n;ch_ad=(char*)malloc(sizeof(char)*m*n);for(i=0;i<m*n;i++){ch_ad[i]=0;}}else{cout<<"未知类型,请输入c,r或l"<<endl;}}//获取矩阵数据首地址函数double*matrix::GetMat(){if((mat_ad==NULL)&&(matcplx_ad==NULL)&&(ch_ad==NULL)){//cout<<"矩阵不存在,或还未指定大小!"<<endl;return(NULL);}else//if((mat_ad!=NULL)&&(matcplx_ad==NULL)){return(mat_ad);}}//获取复矩阵数据首地址函数ComplexNum*matrix::GetMatCplx(){if((mat_ad==NULL)&&(matcplx_ad==NULL)&&(ch_ad==NULL)){//cout<<"矩阵不存在,或还未指定大小!"<<endl;return(NULL);}else//if((mat_ad==NULL)&&(matcplx_ad!=NULL)){return(matcplx_ad);}}//获取字符阵数据首地址函数char*matrix::GetMatChar(){if((mat_ad==NULL)&&(matcplx_ad==NULL)&&(ch_ad==NULL)){//cout<<"矩阵不存在,或还未指定大小!"<<endl;return(NULL);}else//if((mat_ad==NULL)&&(matcplx_ad!=NULL)){return(ch_ad);}}//重新设置矩阵行voidmatrix::SetRow(intm){row=m;}//重新设置矩阵列voidmatrix::SetColumn(intn){column=n;}//重新设置实数矩阵指针地址voidmatrix::SetDataAD(double*p){mat_ad=p;}//重新设置复数矩阵指针地址voidmatrix::SetDataAD(ComplexNum*p){matcplx_ad=p;}//重新设置实矩阵的指定元素值voidmatrix::SetElement(doublex,intm,intn){m=m-1;n=n-1;mat_ad[m*column+n]=x;}//重新设置复矩阵的指定元素值voidmatrix::SetElement(ComplexNumx,intm,intn){m=m-1;n=n-1;matcplx_ad[m*column+n].re=x.re;matcplx_ad[m*column+n].im=x.im;}//矩阵赋值,将一维数组赋值到实矩阵voidmatrix::AssignMat(doublea[],intm,intn){//条件判断inti=0,j=0;if((row==0)||(column==0)){row=m;column=n;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}}for(i=0;i<row;i++)for(j=0;j<column;j++){mat_ad[i*column+j]=a[i*column+j];}matcplx_ad=NULL;}//矩阵赋值,将一维数组赋值到复矩阵*a,intm,intn){//条件判断inti=0,j=0;if((row==0)||(column==0)){row=m;column=n;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}}for(i=0;i<row;i++)for(j=0;j<column;j++){matcplx_ad[i*column+j].re=a[i*column+j].re;matcplx_ad[i*column+j].im=a[i*column+j].im;}mat_ad=NULL;}//矩阵赋值,将一维字符数组赋值到字符矩阵voidmatrix::AssignMat(char*a,intm,intn){//条件判断inti=0,j=0;if((row==0)||(column==0)){row=m;column=n;ch_ad=(char*)malloc(sizeof(char)*row*column);for(i=0;i<row*column;i++){ch_ad[i]=0;}}for(i=0;i<row;i++)for(j=0;j<column;j++){ch_ad[i*column+j]=a[i*column+j];}mat_ad=NULL;matcplx_ad=NULL;}//矩阵相加,C=A+Bvoidmatrix::MatrixAdd(matrixC,matrixA,matrixB){double*a_ad,*b_ad;inta_row,a_column,b_row,b_column;inti=0,j=0;ComplexNum*a_cplxad,*b_cplxad;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//条件判断if((a_row!=b_row)||(a_column!=b_column)){cout<<"A与B不能相加"<<endl;return;}if((a_ad!=NULL)&&(b_ad!=NULL))mat_ad=NULL;}if((a_cplxad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){if((row==0)||(column==0)){row=a_row;column=a_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;}for(i=0;i<row;i++)for(j=0;j<column;j++){mat_ad[i*column+j]=a_ad[i*column+j]+b_ad[i*column+j];}}elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){if((row==0)||(column==0)){row=a_row;column=a_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}{matcplx_ad[i*column+j].re=a_cplxad[i*column+j].re+b_cplxad[i*column+j].re;matcplx_ad[i*column+j].im=a_cplxad[i*column+j].im+b_cplxad[i*column+j].im;}}elseif((a_cplxad!=NULL)&&(b_ad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){matcplx_ad[i*column+j].re=a_cplxad[i*column+j].re+b_ad[i*column+j];matcplx_ad[i*column+j].im=a_cplxad[i*column+j].im;}}elseif((a_ad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){matcplx_ad[i*column+j].re=a_ad[i*column+j]+b_cplxad[i*column+j].re;matcplx_ad[i*column+j].im=b_cplxad[i*column+j].im;}}}}//矩阵相加,C=A-Bfor(j=0;j<column;j++){mat_ad[i*column+j]=a_ad[i*column+j]-b_ad[i*column+j];}}A,matrixB){double*a_ad,*b_ad;intinti=0,j=0;ComplexNum*a_cplxad,*b_cplxad;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//条件判断if((a_row!=b_row)||(a_column!=b_column)){cout<<"A与B不能相减"<<endl;return;}if((a_ad!=NULL)&&(b_ad!=NULL)){if((row==0)||(column==0)){row=a_row;column=a_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;}for(i=0;i<row;i++)elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){if((row==0)||(column==0)){row=a_row;column=a_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;}if((a_cplxad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){matcplx_ad[i*column+j].re=a_cplxad[i*column+j].re-b_cplxad[i*column+j].re;matcplx_ad[i*column+j].im=a_cplxad[i*column+j].im-b_cplxad[i*column+j].im;}}elseif((a_cplxad!=NULL)&&(b_ad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){matcplx_ad[i*column+j].re=a_cplxad[i*column+j].re-b_ad[i*column+j];matcplx_ad[i*column+j].im=a_cplxad[i*column+j].im;}}elseif((a_ad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){matcplx_ad[i*column+j].re=a_ad[i*column+j]-b_cplxad[i*column+j].re;matcplx_ad[i*column+j].im=-b_cplxad[i*column+j].im;}}}}//矩阵拷贝,B=A,外部由B引用voidmatrix::MatrixCopy(matrixB,matrixA){double*a_ad,*b_ad;intinti=0,j=0;ComplexNum*a_cplxad,*b_cplxad;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//拷贝条件判断if((b_ad!=NULL)&&(a_cplxad!=NULL))//当把一个复矩阵拷贝成一个实矩阵时,输出警告{cout<<"警告:复数矩阵不能被拷贝到实数矩阵!!"<<endl;return;}if((a_ad!=NULL)&&(b_ad==NULL)&&(b_cplxad==NULL))//a为实矩阵而b未指定大小时{row=a_row;column=a_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;for(i=0;i<a_row;i++){for(j=0;j<a_column;j++){mat_ad[i*a_column+j]=a_ad[i*a_column+j];}}}elseif((a_cplxad!=NULL)&&(b_ad==NULL)&&(b_cplxad==NULL))//a为复矩阵而b未指定大小时{row=a_row;column=a_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;b_cplxad=matcplx_ad;for(i=0;i<a_row;i++){b_cplxad[i*column+j].im=a_cplxad[i*column+j].im;}}elseif((a_ad!=NULL)&&(b_cplxad!=NULL)){matcplx_ad[i*a_column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[i*a_column+j].im=a_cplxad[i*a_column+j].im;}}}if((a_ad!=NULL)&&(b_ad!=NULL)){for(i=0;i<row;i++){for(j=0;j<column;j++){b_ad[i*column+j]=a_ad[i*column+j];}}}elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){if((a_cplxad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){b_cplxad[i*column+j].re=a_cplxad[i*column+j].re;{for(i=0;i<row;i++)for(j=0;j<column;j++){b_cplxad[i*column+j].re=a_ad[i*column+j];b_cplxad[i*column+j].im=0;}}}}//矩阵显示到屏幕voidmatrix::Display(){inti,j;if((row==0)||(column==0)){cout<<"矩阵不存在!!"<<endl;return;}if(mat_ad!=NULL){cout<<"Row="<<row<<endl;cout<<"Column="<<column<<endl;for(i=0;i<row;i++){for(j=0;j<column;j++){cout<<mat_ad[i*column+j]<<'';}cout<<endl;}}elseif(matcplx_ad!=NULL){cout<<"Row="<<row<<endl;cout<<"Column="<<column<<endl;for(i=0;i<row;i++){for(j=0;j<column;j++){printf("(%.5f)+(%.5f)ia_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//如B不存在,为其按A的属性分配相应的空间if((b_ad==NULL)&&(b_cplxad==NULL)){",matcplx_ad[i*column+j].re,matcplx_ad[i*column+j].im);}cout<<endl;}}elseif(ch_ad!=NULL){cout<<"Row="<<row<<endl;cout<<"Column="<<column<<endl;for(i=0;i<row;i++){for(j=0;j<column;j++){printf("%c",ch_ad[i*column+j]);}cout<<endl;}}}//矩阵转置,B=A',外部由B引用voidmatrix::Transpose(matrix&B,matrixA){double*a_ad,*b_ad;intinti=0,j=0;ComplexNum*a_cplxad,*b_cplxad;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();a_ad=A.GetMat();if((a_ad!=NULL)&&(a_cplxad==NULL)){row=a_column;column=a_row;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;b_ad=mat_ad;}elseif((a_ad==NULL)&&(a_cplxad!=NULL)){row=a_column;column=a_row;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;b_cplxad=matcplx_ad;}}//实数矩阵转置if((a_ad!=NULL)&&(b_ad!=NULL)){for(i=0;i<row;i++){for(j=0;j<column;j++){mat_ad[i*column+j]=a_ad[j*row+i];a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//移除行条件判断}}}//复数矩阵转置elseif((a_cplxad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++)for(j=0;j<column;j++){b_cplxad[i*column+j].re=a_cplxad[j*row+i].re;b_cplxad[i*column+j].im=a_cplxad[j*row+i].im;}}else//矩阵转置类型不同时,输出警告{cout<<"矩阵类型不相容,不能转置!!"<<endl;return;}}//移去A矩阵的指定行,作为B矩阵,由B引用voidmatrix::RemoveRow(matrix&B,matrixA,intdel_row){double*a_ad,*b_ad;intinti=0,j=0;ComplexNum*a_cplxad,*b_cplxad;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();if((b_ad!=NULL)&&(a_cplxad!=NULL))//当把一个复矩阵移除行成一个实矩阵时,输出警告{cout<<"警告:复数矩阵不能通过移除一行到实数矩阵!!"<<endl;return;}if((a_ad!=NULL)&&(b_ad==NULL)&&(b_cplxad==NULL))//a为实矩阵而b未指定大小时{row=a_row-1;column=a_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;for(i=0;i<a_row;i++){for(j=0;j<a_column;j++){if(i<del_row-1){mat_ad[i*a_column+j]=a_ad[i*a_column+j];}elseif(i>del_row-1){mat_ad[(i-1)*a_column+j]=a_ad[i*a_column+j];}}}B.SetRow(row);}elseifB.SetRow(row);}if((a_ad!=NULL)&&(b_ad!=NULL)){((a_cplxad!=NULL)&&(b_ad==NULL)&&(b_cplxad==NULL))//a为复矩阵而b未指定大小时{row=a_row-1;column=a_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;b_cplxad=matcplx_ad;for(i=0;i<a_row;i++){{if(i<del_row-1){matcplx_ad[i*a_column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[i*a_column+j].im=a_cplxad[i*a_column+j].im;}else{matcplx_ad[(i-1)*a_column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[(i-1)*a_column+j].im=a_cplxad[i*a_column+j].im;}}}if((row==0)||(column==0)){row=a_row-1;column=a_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;}for(i=0;i<a_row;i++){for(j=0;j<a_column;j++){if(i<del_row-1){mat_ad[i*a_column+j]=a_ad[i*a_column+j];}elseif(i>del_row-1){mat_ad[(i-1)*a_column+j]=a_ad[i*a_column+j];}}}B.SetRow(row);}elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){if((row==0)||(column==0)){row=a_row-1;column=a_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;b_cplxad=matcplx_ad;}if((a_cplxad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<a_row;i++){{if(i<del_row-1){matcplx_ad[i*a_column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[i*a_column+j].im=a_cplxad[i*a_column+j].im;}else{matcplx_ad[(i-1)*a_column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[(i-1)*a_column+j].im=a_cplxad[i*a_column+j].im;}}}B.SetRow(row);}elseif((a_ad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<a_row;i++){for(j=0;j<a_column;j++){if(i<del_row-1){matcplx_ad[i*a_column+j].re=a_ad[i*a_column+j];matcplx_ad[i*a_column+j].im=0;}elseif(i>del_row-1){matcplx_ad[(i-1)*a_column+j].re=a_ad[i*a_column+j];matcplx_ad[(i-1)*a_column+j].im=0;}}}}B.SetRow(row);}}//移去矩阵的指定列,作为B矩阵voidmatrix::RemoveColumn(matrix&B,matrixA,intdel_column){matrixC,D;C.Transpose(C,A);D.RemoveRow(D,C,del_column);B.Transpose(B,D);C.ReleaseSpace();D.ReleaseSpace();}//矩阵相乘,C=A*Bvoidmatrix::MatrixPlus(matrixC,matrixA,matrixB){double*a_ad,*b_ad;inta_row,a_column,b_row,b_column;inti=0,j=0,k=0;ComplexNum*a_cplxad,*b_cplxad,sum;doubletemp=0;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//相乘条件判断if(a_column!=b_row)//当A的列数和B的行数不相等时,输出警告{cout<<"警告:A,B不能相乘!!"<<endl;return;}if((a_ad!=NULL)&&(b_ad!=NULL)){if((row==0)||(column==0)){row=a_row;column=b_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}matcplx_ad=NULL;}for(i=0;i<a_row;i++){for(j=0;j<b_column;j++){for(k=0;k<a_column;k++){temp=a_ad[i*a_column+k]*b_ad[k*b_column+j]+temp;}mat_ad[i*b_column+j]=temp;temp=0;}}}elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){if((row==0)||(column==0)){row=a_row;column=b_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;}if((a_cplxad!=NULL)&&(b_cplxad!=NULL)){sum.re=0;sum.im=0;for(i=0;i<a_row;i++)for(k=0;k<b_column;k++){for(j=0;j<a_column;j++){sum.re=sum.re+a_cplxad[i*a_column+j].re*b_cplxad[j*b_column+k].re-a_cplxad[i*a_column+j].im*b_cplxad[j*b_column+k].im;sum.im=sum.im+a_cplxad[i*a_column+j].re*b_cplxad[j*b_column+k].im+a_cplxad[i*a_column+j].im*b_cplxad[j*b_column+k].re;}matcplx_ad[i*b_column+k]=sum;sum.re=0;sum.im=0;}}elseif((a_cplxad!=NULL)&&(b_ad!=NULL)){sum.re=0;sum.im=0;for(i=0;i<a_row;i++)for(k=0;k<b_column;k++){for(j=0;j<a_column;j++){sum.re=sum.re+a_cplxad[i*a_column+j].re*b_ad[j*b_column+k];sum.im=sum.im+a_cplxad[i*a_column+j].im*b_ad[j*b_column+k];}matcplx_ad[i*b_column+k]=sum;sum.re=0;sum.im=0;}}elseif((a_ad!=NULL)&&(b_cplxad!=NULL)){sum.re=0;sum.im=0;for(i=0;i<a_row;i++)for(k=0;k<b_column;k++){for(j=0;j<a_column;j++){sum.re=sum.re+b_cplxad[i*a_column+j].re*a_ad[j*b_column+k];sum.im=sum.im+b_cplxad[i*a_column+j].im*a_ad[j*b_column+k];}matcplx_ad[i*b_column+k]=sum;sum.re=0;sum.im=0;}}}}//常数矩阵相乘,C=A*b,外部由C引用voidmatrix::MatrixPlus(matrixC,matrixA,doubleb){double*a_ad;inta_row,a_column,c_row,c_column;inti=0,j=0,k=0;ComplexNum*a_cplxad;a_row=A.GetRow();a_column=A.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();c_row=C.GetRow();c_column=C.GetColumn();//相乘条件判断if(((c_row!=a_row)||(c_column!=a_column))&&(!((row==0)||(column==0)))){cout<<"警告:输出矩阵C大小错误!!"<<endl;return;}if((row==0)||(column==0)){row=a_row;column=a_column;if(a_ad!=NULL){mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++)matcplx_ad[i*column+j].re=a_cplxad[i*column+j].re*b;matcplx_ad[i*column+j].im=a_cplxad[i*column+j].im*b;}}{mat_ad[i]=0;}matcplx_ad=NULL;ch_ad=NULL;}elseif(a_cplxad!=NULL){*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}mat_ad=NULL;ch_ad=NULL;}}if(a_ad!=NULL){for(i=0;i<row;i++)for(j=0;j<column;j++){mat_ad[i*column+j]=a_ad[i*column+j]*b;}}elseif(a_cplxad!=NULL){for(i=0;i<row;i++)for(j=0;j<column;j++){}//矩阵的横向连接voidmatrix::LevelLinkMatrix(matrix&C,matrixA,matrixB){double*a_ad,*b_ad,*c_ad;inta_row,a_column,b_row,b_column,c_row,c_column;inti=0,j=0,k=0;ComplexNum*a_cplxad,*b_cplxad,*c_cplxad;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();c_row=C.GetRow();c_column=C.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();c_ad=C.GetMat();c_cplxad=C.GetMatCplx();//拼接条件判断if(a_row!=b_row)//当A的列数和B的行数不相等时,输出警告{cout<<"警告:A,B不能横向拼接!!"<<endl;return;}else{{for(i=0;i<row;i++)cout<<"C空间与A,B不匹{配!!"<<endl;k=0;return;for(j=0;j<column;j++)}{elseif((c_row==0)||(c_column==0))if(j<a_column){if((a_ad!=NULL)&&(b_ad!=NULL)){row=a_row;column=a_column+b_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}c_ad=mat_ad;matcplx_ad=NULL;c_cplxad=matcplx_ad;}elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){row=a_row;column=a_column+b_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}c_cplxad=matcplx_ad;mat_ad=NULL;c_ad=mat_ad;}}if((a_ad!=NULL)&&(b_ad!=NULL)){mat_ad[i*column+j]=a_ad[i*a_column+j];}else{mat_ad[i*column+j]=b_ad[i*b_column+k];k++;}}}}elseif((a_cplxad!=NULL)||(b_cplxad!=NULL)){if((a_cplxad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++){k=0;for(j=0;j<column;j++){if(j<a_column){matcplx_ad[i*column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[i*column+j].im=a_cplxad[i*a_column+j].im;}else{matcplx_ad[i*column+j].re=b_cplxad[i*b_column+k].re;matcplx_ad[i*column+j].im=b_cplxad[i*b_column+k].im;k++;}}}}elseif((a_cplxad!=NULL)&&(b_ad!=NULL)){for(i=0;i<row;i++){k=0;for(j=0;j<column;j++){if(j<a_column){matcplx_ad[i*column+j].re=a_cplxad[i*a_column+j].re;matcplx_ad[i*column+j].im=a_cplxad[i*a_column+j].im;}else{matcplx_ad[i*column+j].re=b_ad[i*b_column+k];matcplx_ad[i*column+j].im=0;k++;}}}}elseif((a_ad!=NULL)&&(b_cplxad!=NULL)){for(i=0;i<row;i++){k=0;for(j=0;j<column;j++){if(j<a_column){matcplx_ad[i*column+j].re=a_ad[i*a_column+j];matcplx_ad[i*column+j].im=0;}else{matcplx_ad[i*column+j].re=b_cplxad[i*b_column+k].re;matcplx_ad[i*column+j].im=b_cplxad[i*b_column+k].im;k++;}}}}}}//矩阵的竖向连接voidmatrix::VerticalLinkMatrix(matrix&C,matrixA,matrixB){matrixA1,B1,C1;A1.Transpose(A1,A);B1.Transpose(B1,B);C1.LevelLinkMatrix(C1,A1,B1);C.Transpose(C,C1);A1.ReleaseSpace();B1.ReleaseSpace();C1.ReleaseSpace();}//得到一个m维单位矩阵Avoidmatrix::UnitMatrix(intm){inti=0;if((row==0)||(column==0)){row=m;column=m;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}mat_ad[0]=0;}for(i=0;i<m;i++)mat_ad[i*m+i]=1;}//交换矩阵的两行voidmatrix::ChangeRow(matrix&B,matrixA,intm,intn){double*a_ad,*b_ad;intinti=0;ComplexNum*a_cplxad,*b_cplxad;ComplexNumtemp_cplx;doubletemp_re=0;a_row=A.GetRow();a_column=A.GetColumn();b_row=B.GetRow();b_column=B.GetColumn();a_ad=A.GetMat();a_cplxad=A.GetMatCplx();b_ad=B.GetMat();b_cplxad=B.GetMatCplx();//交换条件判断if((b_row!=0)&&(b_column!=0)){if((a_row!=b_row)||(a_column!=b_column))//当A的大小和B的大小不相等时,输出警告{cout<<"警告:A,B大小不兼容!!"<<endl;return;}}elseif((b_row==0)||(b_column==0)){if(a_ad!=NULL){row=a_row;column=a_column;mat_ad=(double*)malloc(sizeof(double)*row*column);for(i=0;i<row*column;i++){mat_ad[i]=0;}b_ad=mat_ad;matcplx_ad=NULL;b_cplxad=matcplx_ad;}elseif(a_cplxad!=NULL){row=a_row;column=a_column;matcplx_ad=(ComplexNum*)malloc(sizeof(ComplexNum)*row*column);for(i=0;i<row*column;i++){matcplx_ad[i].re=0;matcplx_ad[i].im=0;}b_cplxad=matcplx_ad;mat_ad=NULL;b_ad=mat_ad;}}if(a_ad!=NULL){B.MatrixCopy(B,A);for(i=0;i<column;i++){A1.ReleaseSpace();temp_re=mat_ad[(m-1)*column+i];B1.ReleaseSpace();}mat_ad[(m-1)*column+i]=mat_ad[(n-1)*column+i];//取出实数矩阵指定行列的元素voidmatrix::GetElement(double&x,intmat_ad[(n-1)*column+i]=temp_re;m,intn)}}elseif(a_cplxad!=NULL)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 教育公众确保药品冷链的可持续发展
- 小学生寒假安全教育主题班会课件
- 平面构成在服装设计中的运用
- 工资方面的培训课件
- 2022年智慧医院大数据分析BI平台综合解决方案
- 染色体变异获奖课件课
- 印染机械修理创新创业项目商业计划书
- 学前儿童心理发展的主要特征
- 剑桥少儿英语预备级上册第九单元省公开课一等奖全国示范课微课金奖课件
- 燃料的燃烧第3课时
- 劳动仲裁申请书电子版模板
- 电力工程企业的绩效考核与激励体系设计
- 姜黄素项目投资可行性研究报告
- 2025年云南省康旅控股集团有限公司招聘笔试参考题库含答案解析
- 八年级数学下册 第二学期 期末综合测试卷(湘教版 2025年春)(二)
- 集团内训师管理办法
- 2025年客房服务员(高级)客房服务员职业技能培训题库
- 医院防暴伤医培训
- 办公楼电气系统改造方案
- 征地拆迁工作整改措施
- GB/T 45089-20240~3岁婴幼儿居家照护服务规范
评论
0/150
提交评论