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

下载本文档

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

文档简介

1、Good is good, but better carries it.精益求精,善益求善。Matlab基本用法小结-(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替换s1length(A)字符串A的长度de

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

3、变量的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:AlanShearerheight:180test:4x3double其中test成员为单元型数据。删除成员变量可以由rmfield()函数进行,添加成员变量可以直

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

5、义加、减、乘及乘方等运算,并定义其显示方式。那么建立一个类至少应该执行下面的步骤:(这个例子更详细的情况请参考MATLAB手册)首先应该选定一个恰当的名字,例如这里的多项式类可选择为polynom。以这个名字建立一个子目录,目录的名字前加。对本例来说,即应该在当前的工作目录下建立polynom子目录,而这个目录无需在MATLAB路径下再指定。编写一个引导函数,函数名应该和类同名。定义类的使用方法:functionp=polynom(a)ifnargin=0p.c=;p=class(p,polynom);elseifisa(a,polynom),p=a;else,p.c=a(:).;p=clas

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

7、)disp();disp(char(p);disp();注意,这里应该定义的是display()而不是disp()。从上面的定义可见,显示函数要求重载定义char()函数,用于把多项式转换成可显示的字符串。该函数的定义为functions=char(p)ifall(p.c=0),s=0;elsed=length(p.c)-1;s=;fora=p.c;ifa=0;ifisempty(s)ifa0,s=s,+;else,s=s,-;a=-a;endendifa=1|d=0,s=s,num2str(a);ifd0,s=s,*;endendifd=2,s=s,x,int2str(d);elseifd=

8、1,s=sx;endendd=d-1;end,end仔细研究此函数,可以发现,该函数能自动地按照多项式显示的格式构造字符串。比如,多项式各项用加减号连接,系数与算子之间用乘号连接,而算子的指数由表示。再配以显示函数,则可以将此多项式以字符串的形式显示出来。双精度处理:双精度转换函数的重载定义是很简单的。functionc=double(p)c=p.c;加运算:两个多项式相加,只需将其对应项系数相加即可。这样,加法运算的重载定义可由下面的函数实现。注意,这里要对plus()函数进行重载定义。functionp=plus(a,b)a=polynom(a);b=polynom(b);k=length

9、(b.c)-length(a.c);p=polynom(zeros(1,k)a.c+zeros(1,-k)b.c);同理,还可以重载定义多项式的减法运算:functionp=minus(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);乘法运算:多项式的乘法实际上可以表示为系数向量的卷积,可以由conv()函数直接获得。故可以如下重载定义多项式的乘法运算。functionp=mtimes(a,b)a=polynom(a);b=polynom(b);p=p

10、olynom(conv(a.c,b.c);乘方运算:多项式的乘方运算只限于正整数乘方的运算,其n次方相当于将该多项式自乘n次。若n=0,则结果为1。这样我们就可以重载定义多项式的乘方运算为: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=pol

11、yval(a.c,x);定义了此类之后,我们就可以方便地进行多项式处理了。例如我们可以建立两个多项式对象P(s)=x3+4x2-7和Q(s)=5x4+3x3-1.5x2+7x+8其相应的MATLAB语句为P=polynom(1,4,0,-7),Q=polynom(5,3,-1.5,7,8)P=x3+4*x2-7Q=5*x4+3*x3-1.5*x2+7*x+8然后调用下面函数就可以得出相应的计算结果P+Qans=5*x4+4*x3+2.5*x2+7*x+1P-Qans=-5*x4-2*x3+5.5*x2-7*x-15P*Qans=5*x7+23*x6+10.5*x5-34*x4+15*x3+42

12、.5*x2-49*x-56X=P3X=x9+12*x8+48*x7+43*x6-168*x5-336*x4+147*x3+588*x2-343y=polyval(X,123456)y=-8491317561617715611036023243986977由于前面的重载定义,下面的表达式也能得出期望的结果P+123ans=x3+5*x2+2*x-4使用methods()函数可以列出一个新的类已经定义的方法函数名。methods(polynom)Methodsforclasspolynom:chardoublempowerpluspolyvaldisplayminusmtimespolynom变量

13、的运算(1)MATLAB变量的代数运算如果给定两个矩阵A和B,则我们可以用A+B,A-B,A*B可以立即得出其加、减和乘运算的结果。若这两个矩阵数学上不可以这样运算,则将得出错误信息,并终止正在运行的程序。在MATLAB下,如果A和B中有一个是标量,则可以无条件地进行这样的运算。MATLAB不介意这些变量是纯实数还是含有虚部的复数。矩阵的除法实际上就是线性方程的求解,如Ax=B这一线性方程的解即为x=inv(A)*B,或更简单地x=AB。这又称为矩阵的左除,而x=B/A称为矩阵的右除。方阵的乘方可以由算符直接得出,如An。用MATLKAB这样的语言,你可以轻易地算出A0.1,亦即A矩阵开10次

14、方得出的主根。矩阵的点运算也是相当重要的。所谓点运算即两个矩阵相应元素的元素,如A.*B得出的是A和B对应元素的积,故一般情况下A*B不等于A.*B。矩阵的点乘又称为其Hadamard积。点运算的概念又可以容易地用到点乘方上,例如A.2,A.A等都是可以接受的运算式子。Kronecker乘积是MATLAB在矩阵运算中的另一个有意义的问题,用kron(A,B)立即可以得出两个矩阵的Kronecker乘积。(2)逻辑运算MATLAB并没有单独定义逻辑变量。在MATLAB中,数值只有0和“非0”的区分。非0往往被认为是逻辑真,或逻辑1。除了单独两个数值的逻辑运算外,还支持矩阵的逻辑运算,如A&B,A

15、|B,和A分别表示逻辑与、或、非的运算。例如,下面的A和B矩阵与运算将得出如下结果A=0234;1350;B=1053;1505;A&Bans=00111100(3)关系表达式与表达式函数MATLAB的大于、小于和等于等关系分别由、A=0234;1350;B=1053;1505;A=Bans=00001000确实使得A和B对应元素相等的位将返回1,否则返回0。MATLAB还可以用=和=这样的符号来比较矩阵对应元素的大小。另外,MATLAB还提供了all()和any()两个函数来对矩阵参数作逻辑判定。all()函数在其中变元全部非0时返回1,而any()函数在变元有非零元素返回1。find()函

16、数将返回逻辑关系全部满足时的矩阵下标值,这个函数在编程中是相当常用。还可以使用isnan()类函数来判定矩阵中是否含有NaN型数据。如果有则返回这样参数的下标。此类函数还有isfinite(),isclass(),ishandle()等。(4)其他运算MATLAB还支持其他运算,如取整、求余数等。可以使用rond)_,fix(),rem()等来实现。在实际编程中,在MATLAB下采用循环语句会降低其执行速度,所以前面的程序可以由下面的命令来代替:i=1:100;mysum=sum(i)。在这一语句中,首先生成了一个向量i,然后用内部函数sum()求出i向量的各个元素之和,或更简单地,该语句还可

17、以写成sum(1:100)。如果前面的100改成10000,再运行这一程序,则可以明显地看出,后一种方法编写的程序比前一种方法快得多。MATLAB并不要求循环点等间距,假设V为任意一个向量,则可以用fori=V来表示循环。同样的问题在while循环结构下可以表示为mysum=0;i=1;while(i1,error(Toomanyoutputarguments.);endifnargin=1,m=n;elseifnargin=0|nargin2error(Wrongnumberofiutputarguments.);endA1=zeros(n,m);fori=1:nforj=1:mA1(i,j

18、)=1/(i+j-1);end,endifnargout=1,A=A1;elseifnargout=0,disp(A1);end这样规范编写的函数用help命令可以显示出其帮助信息:helpmyhilbMYHILBademonstrativeM-function.A=MYHILB(N,M)generatesanNbyMHilbertmatrixA.A=MYHILB(N)generatesanNbyNsquareHilbertmatrix.MYHILB(N,M)displaysONLYtheHilbertmatrix,butdonotreturnanymatrixbacktothecalling

19、function.Seealso:HILB.有了函数之后,可以采用下面的各种方法来调用它,并产生出所需的结果。A=myhilb(3,4)A=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.1667A=myhilb(4)A=1.00000.50000.33330.25000.50000.33330.25000.20000.33330.25000.20000.16670.25000.20000.16670.1429myhilb(4)1.00000.50000.33330.25000.50000.33330.25

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

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

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

23、的方法比常规循环运算效率要高得多。tic,i=1:100000;s=sum(1./2.i+1./3.i),tocs=1.5000elapsed_time=0.3800(2)在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的。这样也可以显著提高速度。例3.20考虑生成一个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.6800tic,forj=1:10000fori=1:5J(i,j)=1/(i+j-1);endendtocelapsed_time=25.7000大型矩阵的预先定维给大型矩阵动态地定维是个很费时间的事。建议在定义大矩阵时,首先用MATLAB的内在函数,如zeros()或ones()对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间的。再考虑例3-20中的问题,如果输入下面的

温馨提示

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

评论

0/150

提交评论