基本用法小结_第1页
基本用法小结_第2页
基本用法小结_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、(3)字符申与字符申矩阵MATLAB勺字符申是由单引号括起来的。如可以使用下面的命令赋值>>strA='Thisisastring.多个字符串可以用str2mat()函数构造出字符串矩阵。如B=str2mat(strA,'ksasaj','aa');字符串变量可以由下表中的命令进行操作:命令意义命令意义|strcmp(A,B)比较A和B字符申是否相同。findstr(A,B)测试A是否为B的子字符申,或反过来strrep(A,s1,s2)在A中用s2替换silength(A)字符申A的长度deblank(A)删除A字符申尾部的空格double

2、(A)字符申转换双精度数据(4)单元数据结构用类似矩阵的记号将给复杂的数据结构纳入一个变量之下。和矩阵中的圆括号表示下标类似,单元数组由大括号表示下标。>>B=1,'AlanShearer',180,100,80,75;77,60,92;67,28,90;100,89,78B='AlanShearer'1804x3double访问单元数组应该由大括号进行,如第4单元中的元素可以由下面的语句得出>>B4ans=10080757760926728901008978结构体MATLAB勺结构体有点象C语言的结构体数据结构。每个成员变量用点号表示,

3、如A.p表示A变量的p成员变量。获得该成员比C更直观,仍用A.p访问,而不用A->p。用下面的语句可以建立一个小型的数据库。>>student_rec.number=1;student_='AlanShearer'student_rec.height=180;student_rec.test=100,80,75;77,60,92;67,28,90;100,89,78;>>student_recstudent_rec=number:1name:'AlanShearer'height:180test:4x3double其

4、中test成员为单元型数据。删除成员变量可以由rmfield()函数进行,添加成员变量可以直接由赋值语句即可。另外数据读取还可以由setfield和getfield函数完成。(6)类与对象类与对象是MATLAB.*开始引入的数据结构。在MATLAW册中定义了一各很好的类-多项式类。该例子值得细读,去体会类和对象的定义,重载函数编写等信息。事实上,在实际工具箱设计中,用到了很多的类,例如在控制系统工具箱中定义了LTI(线性时不变系统)类,并在此基础上定义了其子类:传递函数类TF,状态方程类SS,零极点类ZPK和频率响应类FR。举例:我们将通过一个例子来介绍类的构造。在MATLAE®言使

5、用手册中给出了一个很有代表性的例子:多项式类的建立问题。假设我们想为多项式建立一个单独的类,重新定义加、减、乘及乘方等运算,并定义其显示方式。那么建立一个类至少应该执行下面的步骤:(这个例子更详细的情况请参考MATLA町册)首先应该选定一个恰当的名字,例如这里的多项式类可选择为polynom。,以这个名字建立一个子目录,目录的名字前加。对本例来说,即应该在当前的工作目录下建立polynom子目录,而这个目录无需在MATLAB各径下再指定。编写一个引导函数,函数名应该和类同名。定义类的使用方法:functionp=polynom(a)ifnargin=0p.c=;p=class(p,'p

6、olynom');elseifisa(a,'polynom'),p=a;else,p.c=a(:).'p=class(p,'polynom');end可以看出,本函数分三种情况加以考虑: 如果不给输入变量,则建立一个空的多项式;如果输入变量a已经为多项式类,则将它直接传送给输出变量p;如果a为向量,则将此向量变换成行向量,再构造成一个多项式对象。如果想正确地显示新定义的类,则必需首先定义display()函数,并对新定义的类重新定义其基本运算。对多项式来说,我们可以如下定义有关的函数:要改变显示函数的定义,则需在此目录下重新建立一个新函数disp

7、lay()。这种重新定义函数的方法乂称为函数的重载。显示函数可以如下地重载定义。functiondisplay(p)disp('');disp(inputname(1),'=')disp('');disp(''char(p);disp('');注意,这里应该定义的是display()而不是disp()。从上面的定义可见,显示函数要求重载定义char()函数,用丁把多项式转换成可显示的字符申。该函数的定义为functions=char(p)ifall(p.c=0),s='0'elsed=length(

8、p.c)-1;s=;fora=p.c;ifa=0;ifisempty(s)ifa>0,s=s,'+'else,s=s,'-'a=-a;endendifa=1|d=0,s=s,num2str(a);ifd>0,s=s,'*'endendifd>=2,s=s,'xA',int2str(d);elseifd=1,s=s'x'endendd=d-1;end,end,仔细研究此函数,可以发现,该函数能自动地按照多项式显示的格式构造字符申。比如,多项式各项用加减号连接,系数与算子之间用乘号连接,而算子的指数由

9、A表示。再配以显示函数,则可以将此多项式以字符申的形式显示出来。双精度处理:双精度转换函数的重载定义是很简单的。functionc=double(p)c=p.c;加运算:两个多项式相加,只需将其对应项系数相加即可。这样,加法运算的重载定义可由下面的函数实现。注意,这里要对plus()函数进行重载定义。functionp=plus(a,b)a=polynom(a);b=polynom(b);k=length(b.c)-length(a.c);p=polynom(zeros(1,k)a.c+zeros(1,-k)b.c);同理,还可以重载定义多项式的减法运算:functionp=minus(a,b

10、)a=polynom(a);b=polynom(b);k=length(b.c)-length(a.c);p=polynom(zeros(1,k)a.c-zeros(1,-k)b.c);,乘法运算:多项式的乘法实际上可以表示为系数向量的卷积,可以由conv()函数直接获得。故可以如下重载定义多项式的乘法运算。functionp=mtimes(a,b)a=polynom(a);b=polynom(b);p=polynom(conv(a.c,b.c);乘方运算:多项式的乘方运算只限丁正整数乘方的运算,其n次方相当丁将该多项式自乘n次。若n=0,则结果为1。这样我们就可以重载定义多项式的乘方运算为:

11、functionp=mpower(a,n)ifn>=0,n=floor(n);a=polynom(a);p=1;ifn>=1,fori=1:n,p=p*a;endendelse,error('Powershouldbeanon-negativeinteger.')end多项式求值问题:可以对多项式求值函数polyval()进行重载定义。functiony=polyval(a,x)a=polynom(a);y=polyval(a.c,x);定义了此类之后,我们就可以方便地进行多项式处理了。例如我们可以建立两个多项式对象P(s)=xA3+4xA2-7和Q(s)=5xM+

12、3xA3-1.5xA2+7x+8其相应的-MATLAE®句为>>P=polynom(1,4,0,-7),Q=polynom(5,3,-1.5,7,8)P=xA3+4*xA2-7Q=5*xA4+3*xA3-1.5*xA2+7*x+8然后调用下面函数就可以得出相应的计算结果>>P+Qans=5*xA4+4*xA3+2.5*xA2+7*x+1>>P-Qans=-5*xA4-2*xA3+5.5*xA2-7*x-15>>P*Qans=5*xA7+23*xA6+10.5*xA5-34*xA4+15*xA3+42.5*xA2-49*x-56>&

13、gt;X=PA3X=xA9+12*xA8+48*xA7+43*xA6-168*xA5-336*xA4+147*xA3+588*xA2-343>>y=polyval(X,123456)y=-8491317561617715611036023243986977由丁前面的重载定义,下面的表达式也能得出期望的结果>>P+123ans=xA3+5*xA2+2*x-4使用methods()函数可以列出一个新的类已经定义的方法函数名。>>methods('polynom')Methodsforclasspolynom:chardoublempowerplu

14、spolyvaldisplayminusmtimespolynom变量的运算(1) MATLA豉量的代数运算如果给定两个矩阵A和B,贝U我们可以用A+B,A-B,A*B可以立即得出其加、减和乘运算的结果。若这两个矩阵数学上不可以这样运算,则将得出错误信息,并终止正在运行的程序。在MATLA既,如果A和B中有一个是标量,则可以无条件地进行这样的运算。MATLAE介意这些变量是纯实数还是含有虚部的复数。矩阵的除法实际上就是线性方程的求解,如Ax=B这一线性方程的解即为x=inv(A)*B,或更简单地x=AB。这乂称为矩阵的左除,而x=B/A称为矩阵的右除。方阵的乘方可以由a算符直接得出,如AAn。

15、用MATLKAB这样的语言,你可以轻易地算出AA0.1,亦即A矩阵开10次方得出的主根。矩阵的点运算也是相当重要的。所谓点运算即两个矩阵相应元素的元素,如A.*B得出的是A和B对应元素的积,故一般情况下A*B不等丁A.*B。矩阵的点乘乂称为其Hadamard积。点运算的概念乂可以容易地用到点乘方上,例如A.A2,A.AA等都是可以接受的运算式子。Kronecker乘积是MATLA歌矩阵运算中的另一个有意义的问题,用kron(A,B)立即可以得出两个矩阵的Kronecker乘积。(2) 逻辑运算MATLAB没有单独定义逻辑变量。在MATLAB,数值只有0和“非0”的区分。非0往往被认为是逻辑真,

16、或逻辑1。除了单独两个数值的逻辑运算外,还支持矩阵的逻辑运算,如A&B,A|B,和A分别表示逻辑与、或、非的运算。例如,下面的A和B矩阵与运算将得出如下结果(3) >>A=0234;1350;B=1053;1505;A&Bans=00111100关系表达式与表达式函数MATLAB勺大丁、小丁和等丁等关系分别由>、<和=表示。判定方法不完全等同丁C这类只能处理单个标量的语言。MATLAB关系表达式返回的是整个矩阵。例如,比较两个矩阵A和B是否相等,则可以给出如下命令,并得出相应的结果>>A=0234;1350;B=1053;1505;A=Ban

17、s=00001000确实使得A和B对应元素相等的位将返回1,否则返回0。MATLAB®可以用>=和<=这样的符号来比较矩阵对应元素的大小。另外,MATLAE提供了all()和any()两个函数来对矩阵参数作逻辑判定。all()函数在其中变元全部非0时返回1,而any()函数在变元有非零元素返回1。find()函数将返回逻辑关系全部满足时的矩阵下标值,这个函数在编程中是相当常用。还可以使用isnan()类函数来判定矩阵中是否含有NaN型数据。如果有则返回这样参数的下标。此类函数还有isfinite(),isclass(),ishandle()等。(4) 其他运算MATLAB

18、支持其他运算,如取整、求余数等。可以使用rond)_,fix(),rem()等来实现。在实际编程中,在MATLAB下采用循环语句会降低其执行速度,所以前面的程序可以由下面的命令来代替:i=1:100;mysum=sum(i)。在这一语句中,首先生成了一个向量i,然后用内部函数sum()求出i向量的各个元素之和,或更简单地,该语句还可以写成sum(1:100)。如果前面的100改成10000,再运行这一程序,则可以明显地看出,后一种方法编写的程序比前一种方法快得多。MATLAB不要求循环点等间距,假设V为任意一个向量,则可以用fori=V来表小循环。同样的问题在while循环结构下可以表示为my

19、sum=0;i=1;while(i<=100),mysum=mysum+i;i=i+1;end条件转移语句:和C语言相象if条件式1条件块语句组1elseif条件式2条件块语句组2else条件块语句组n+1end开关结构:MATLAE<5.0版开始提供了开关语句结构,其基本语句结构为:switch开关表达式case表达式1语句段1case(表达式2,表达式3,.,表达式m语句段2otherwise语句段nendMATLA研关语句与C有区别:当开关表达式的值等丁表达式1时,将执行语句段1,执行完语句段1后将转出开关体,无需像C语言那样在下一个case语句前加break语句,所以本结构

20、在这点上和C语言是不同的。当需要在开关表达式满足若干个表达式之一时执行某一程序段,则应该把这样的一些表达式用大括号括起来,中间用逗号分隔。事实上,这样的结构是MATLA即言定义的单元结构,其具体内容将在后面叙述。*当前面枚举的各个表达式均不满足时,则将执行otherwise语句后面的语句段,此语句等价丁C语言中的default语句。在case语句引导的各个表达式中,不要用重复的表达式,否则列在后面的开关通路将永远也不能执行。程序的执行结果和各个case语句的次序是无关的。试探结构:MATLAE<5.2版本开始提供了一种新的试探式语句结构,其一般的形式为:try语句段1catch语句段2e

21、nd本语句结构首先试探性地执行语句段则将错误信息赋给保留的lasterr中的语句。这种新的语句结构是C1,如果在此段语句执行过程中出现错误,变量,并放弃这段语句,转而执行语句段2等语言中所没有的。这里输入和返回变量的实际个数分别由nargin和nargout两个MATLAB保留变量来给出,只要进入该函数,MATLABB将自动生成这两个变量,不论您是否直接使用这两个变量。返回变量如果多丁1个,则应该用方括号将它们括起来,否则可以省去方括号。输入变量和返回变量之间用逗号来分割。注释语句段的每行语句都应该由白分号引导,白分号后面的内容不执行,只起注释。用户采用help命令则可以显示出来注释语句段的内

22、容。此外,正规的变量个数检测也是必要的。如果输入或返回变量格式不正确,则应该给出相应的提示。我们将通过下面的例子来演示函数编程的格式与方法。K例3-2假设我们想生成一个nxm阶的Hilbert矩阵,它的第i行第j歹U的元素值为1/(i+j-1)。我们想在编写的函数中实现下面几点:*如果只给出一个输入参数,则会自动生成一个方阵,即令m=n,在函数中给出合适的帮助信息,包括基本功能、调用方式和参数说明检测输入和返回变量的个数,如果有错误则给出错误信息如果调用时不要求返回变量,则将显示结果矩阵。其实在编写程序时养成一个好的习惯,无论对程序设计者还是对程序的维护者、使用者都是大有裨益的采用MATLAB

23、8数编写格式和上述要求,我们可以编写出一个函数functionA=myhilb(n,m)%MYHILBademonstrativeM-function.%A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.%A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.%MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnany%matrixbacktothecallingfunction.%Seealso:HILB.%DesignedbyProfessorDingyuXUE

24、,NortheasternUniversity,PRC%5April,1995,LastmodifiedbyDYXat21March,2000ifnargout>1,error('Toomanyoutputarguments.');endifnargin=1,m=n;elseifnargin=0|nargin>2error('Wrongnumberofiutputarguments.');endA1=zeros(n,m);fori=1:nforj=1:mA1(i,j)=1/(i+j-1);end,endifnargout=1,A=A1;elseifn

25、argout=0,disp(A1);end这样规范编写的函数用help命令可以显示出其帮助信息:>>helpmyhilbMYHILBademonstrativeM-function.A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnanymatrixbacktothecallingfunction.Seealso:HILB.有了函数之后,可以采用下面

26、的各种方法来调用它,并产生出所需的结果。>>A=myhilb(3,4)A=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.1667>>A=myhilb(4)A=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.16670.25000.20000.16670.1429>>myhilb(4)1.00000.50000.33330.25000.50000.33330.25000.20000.3

27、3330.25000.20000.16670.25000.20000.16670.1429MATLABX具箱编写技巧放入一个目录中的为某种目的专门编写的一组MATLAE®数就可以组成一个工具箱。从某种意义上说,任何一个MATLABS言的使用者都可以是工具箱的作者。在一个工具箱中,应该有一个名为Contents.m的文件,用来描述工具箱中所有MATLAB®数的名称和意义。在该文件中第1行应该给出该工具箱的名称,在第2行中给出该工具箱的版本与修改时间等信息。然后分类地给出该工具箱中各类函数的最基本功能。注意,本文件中所有的语句都应该是注释语句,由白分号%引导,空行也应该由%引导

28、。另外,因为MATLAB一种解释性语言,所以即使在某个或某些函数中存在语法错误,但如果没执行到该语句时可能就不会发现该错误,这在一个成功的程序设计中是不能容许的。要查出某目录中所有的M函数语法错误,首先应该用cd命令进入该目录,然后运行pcode*命令进行伪代码转换。因为该命令会将MATLAES数转换成伪代码,而在转换过程中该程序将自动翻译每一条语句,所以一旦发现有语法错误,将会停止翻译,给出错误信息。改正了该语法错误后,再重新执行pcode命令,直到没有错误为止。至少这样会保证目录下所有的程序不含有语法错误。Matlab的编程技巧,尽量避免使用循环:循环语句及循环体经常被认为是-MATLAE

29、程的瓶颈问题。改进这样的状况有两种方法:(1) 尽量用向量化的运算来代替循环操作。我们将通过如下的例子来演示如何将一般的循环结构转换成向量化的语句。K例3.192考虑下面无穷级数求和问题:”咨(*)如果我们只求出其中前有限项,比如100,000项之和(要精确地求出级数的和,无需求100000项,几十项往往就能得出满意的精度。这里主要是为了演示循环运算向量化的优越性。),则可以采用下面的常规语句进行计算>>tic,s=0;fori=1:100000,s=s+(1/2Ai+1/3Ai);end,s,tocs=1.5000elapsed_time=1.9700如果采用向量化的方法,则可以

30、得出下面结果。可以看出,采取向量化的方法比常规循环运算效率要高得多。>>tic,i=1:100000;s=sum(1./2.Ai+1./3.Ai),tocs=1.5000elapsed_time=(2) 0.3800在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的。这样也可以显著提高速度。K例3.202考虑生成一个5x10000的Hilbert长方矩阵,该矩阵的定义是其第i行第j列元素为h_i,j=1/(i+j-1)。我们可以由下面语句比较先进行i=1:5的循环和后画亍该循环的耗时区别,其效果和前面分析的是一致的。>>ticfori=1:5forj=1:10000H(i,j)=1/(i+j-1);endendtocelapsed_time=8.6800>

温馨提示

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

评论

0/150

提交评论