MATLAB程序设计入门
时间:2015-03-28 15:18 来源:自动控制网
一、ATLBA程序的基本设计原则 (一)%后面的内容是程序的注解,要善于运用注解使程序更具可读性。 (二)养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其他变量对程序运行的影响。但注意在子程序中不要用clear。 (三)参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使其及中间结果不在屏幕上显示,以提高执行速度。 (四)input指令可以用来输入一些临时的数据;而对于大量参数,则通过建立一个存储参数的子程序,在主程序中用子程序的名称来调用。 (五)程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序合并在一起来执行全部的操作。 (六)充分利用Debugger来进行程序的调试(设置断点单步执行连续执行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设计结果集成到一起。 (七)设置好MATLAB的工作路径,以便程序运行。 (八)MATLAB程序的基本组成结构 %说明 清除命令:清除workspace中的变量和图形(clear,close) 定义变量:包括全局变量的声明及参数值的设定 逐行执行命令:指MATLAB提供的运算指令或工具箱 ………提供的专用命令 控制循环:包含for,ifthen,switch,while等语句 逐行执行命令 ……… end 绘图命令:将运算结果绘制出来 当然更复杂程序还需要调用子程序,或与simulink以及其他应用程序结合起来。 二、文件的编辑及MATLAB工作路径的设置 进入MATLAB的Editor/Debugger窗口来编辑程序 在编辑环境中,文字的不同颜色显示表明文字的不同属性。 绿色:注解;黑色:程序主体;红色:属性值的设定;蓝色:控制流程。 在运行程序之前,必须设置好MATLAB的工作路径,使得所要运行的程序及运行程序所需要的其他文件处在当前目录之下,只有这样,才可以使程序得以正常运行。否则可能导致无法读取某些系统文件或数据,从而程序无法执行。 通过cd指令在命令窗口中可以更改显示当前工作路径。 通过路径浏览器(pathbrowser)也可以进行设置 三、ATLAB的程序类型 MATLAB的程序类型有三种,一种是在命令窗口下执行的脚本M文件;另外一种是可以存取的M文件,也即程序文件;最后一种是函数(function)文件。 (一)脚本M文件 在命令窗口中输入并执行,它所用的变量都要在工作空间中获取,不需要输入输出参数的调用,退出MATLAB后就释放了。 (二)程序文件 以.m格式进行存取,包含一连串的MATLAB指令和必要的注解。需要在工作空间中创建并获取变量,也就是说处理的数据为命令窗口中的数据,没有输入参数,也不会返回参数。 程序运行时只需在工作空间中键入其名称即可。 (三)函数文件 与在命令窗口中输入命令一样,函数接受输入参数,然后执行并输出结果。用help命令可以显示它的注释说明。 具有标准的基本结构。 1.函数定义行(关键字function) function[out1,out2,..]=filename(in1,in2,..) 输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保留的变量来给出。 2.第一行帮助行,即H1行 以(%)开头,作为lookfor指令搜索的行 3.函数体说明及有关注解 以(%)开头,用以说明函数的作用及有关内容 如果不希望显示某段信息,可在它的前面加空行 例myhilb1.m;myhilb.m function[A,B]=myhilb(n,m) %问题:生成一个Hilbert矩阵,该矩阵是一个n×m矩阵,它的第i行 %第j列的元素为1/(i+j-1)。如果想在编写的函数中实现下面几点: %1)如果只给出一个输入参数,则会自动生成一个方阵,即有m=n %2)如果想返回两个参数A和B,则返回的B矩阵为A矩阵的平方, %即B=A'A %3)在函数中给出合适的帮助信息,包括基本功能调用方式 %和参数说明 %myhilb生成一个Hilbert矩阵 %[A,B]=myhilb(n,m) %where %n,maresizeoftheHilbertmatrix,ifonlyone %argumentgiven,thenasquarematrixisgenerated %AistheHilbertmatrix %B:iftwomatricestobereturned,Bisassignedto %A'*A %2001/12/1 ifnargin==1,m=n;end fori=1:n forj=1:m A(i,j)=1/(i+j-1); end end if(nargout==2),B=A'*A;end function[A,B]=myhilb(n,m) %MYHILB生成一个Hilbert矩阵 %[A,B]=myhilb(n,m) %where %n,maresizeoftheHilbertmatrix,ifonlyone %argumentgiven,thenasquarematrixisgenerated %AistheHilbertmatrix %B:iftwomatricestobereturned,Bisassignedto %A'*A %2001/12/1 ifnargin==1,m=n;end fori=1:n forj=1:m A(i,j)=1/(i+j-1); end end if(nargout==2),B=A'*A;end 4.函数体语句 函数体内使用的除返回和输入变量这些在function语句中直接引用的变量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自动在MATLAB的工作空间中清除掉。如果希望这些中间变量成为在整个程序中都起作用的变量,则可以将它们设置为全局变量。 四、明子程序(函数程序)变量 (一)子程序与主程序之间的数据是通过参数进行传递的,子程序应用主程序传递来的参数进行计算后,将结果返回主程序。 例exp2_9.m %主程序exp2_9.m a=input('pleaseinputvalueofa='); b=input('pleaseinputvalueofb='); c=sumhe(a,b) %在此例中,主程序exp2_9.m设定了两个参数a和b来调用 %子程序sumhe.m(为一个函数文件), %所以执行主程序时,子程序就会调用主程序传递过来的 %a和b值进行计算,再将结果返回主程序。
%子程序sumhe.m %functionresult=sumhe(a,b) %sumhe(a,b)sumtheserialofnumbersfromatob %result=sum(a:b); (二)如果一个函数内的变量没有特别声明,那么这个变量只在函数内部使用,即为局部变量。如果两个或多个函数共用一个变量(或者说在子程序中也要用到主程序中的变量,注意不是参数),那么可以用global来将它声明为全局变量。 全局变量的使用可以减少参数传递,合理利用全局变量可以提高程序执行的效率。 五、符串及其宏命令 字符串要用单引号并用括号括在里面。如: 》disp(‘textstring’)%disp字符串显示命令 textstring 在单引号里边的字符串可以作为矢量或矩阵的元素。使用disp命令或输入变量名就可以显示它们表示的字符串。如: 》a=['thisisa';'textstring'] Allrowsinthebracketedexpressionmusthavethesamenumberofcolumns.(元素1含9个字符,包括空格;元素2含有11个字符;因此只要在元素1中加入2个空格即可解决问题) 》aa=['thisisa';'textstring']》disp(aa) aa=aa= thisisathisisa textstringtextstring 宏是MATLAB语言用在常用命令部分的缩写。它可以被存储用于建立M文件的一部分。宏命令采用字符串,并使用eval命令去执行宏命令。下例是采用宏命令计算阶乘的例子。 》fct=‘prod(1:n)’;%求10的阶乘 》n=10;eval(fct) ans=3628800 六、用的编程命令 pause:停止m文件的执行直至有键按下。pause(n)将使程序暂停n秒。 echoon/off:控制是否在屏幕上显示程序内容。 keyboard:停止程序执行,把控制权交给键盘。输入return并回车后继续程序执行。 x=input(‘prompt’):把输入的字符串作为提示符,等待使用者输入一个响应,然后把它赋值到x。 echooff%不显示程序内容 例exp2_8.m clear clc a=4; b=6 disp('暂停,请按任意键继续')%disp指令可以用来显示字符 pause%暂停,直到用户按任意键 echoon %显示程序内容,注意matlab默认是不显示 c=a+b %暂时把控制权交给键盘(在命令窗口中出现k提示符), %输入return,回车后退出,继续执行下面的语句。 keyboard d=input('Enterthevalueofd=');%提示用户输入d的值 e=a*24+b*8+d*6-c f=e/d disp('workpause30second')%disp指令可以用来显示字符 pause(10)%暂停10秒 disp(f)%显示指定变量的结果,而不显示变量名称 echooff 七、系与逻辑运算符 MATLAB的运算符有三种类型:算术运算符关系运算符逻辑运算符。它们的处理顺序依次为算术运算符关系运算符逻辑运算符。在前面我们已经介绍例算术运算符,这里我们着重介绍后两种运算符。 (一)关系运算符 假设有:A=[12-1-5]B=[0231]
<1ans=[0011] <小于A >大于A>Bans=[1000]A>1ans=[0100] <=小于等于A<=Bans=[0111] >=大于等于A>=Bans=[1100] ==等于A=Bans=[0100];A=1ans=[1000] ~=不等于A~=Bans=[1011];A~=1ans=[0111] ~非 ~A=[0010]~1=0 (二)逻辑运算符 注意:在处理逻辑运算时,运算元只有两个值即0和1,所以如果指定的数为0,MATLAB认为其为0,而任何数不等于0,则认为是1。 设有:A=[5-40-0.5]B=[0109] &与 A&B=[0101]A&1=[1101] |或 A|B=[1101]A|1=[1111] 步长缺省值为1,可以在正实数或负实数范围内任意指定。对于正数,循环变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束。循环结构可以嵌套使用。 书写格式不必太过于拘泥,在Editor编辑器中会自动进行处理。 八、序流程控制 (一)for循环语句 基本格式 for循环变量=起始值:步长:终止值 循环体 End 例exp2_11.m sum=0; fori=1:100 sum=sum+i; end sum i (二)while循环语句 基本格式 while表达式 循环体 end 若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真,若不为真,则跳出循环体,向下继续执行。 例exp2_12.m sum=0;j=0; whilesum<100 j=j+1; sum=sum+j; end j sum While循环和for循环的区别在于,while循环结构的循环体被执行的次数不是确定的,而for结构中循环体的执行次数是确定的。 (三)if,else,elseif语句 1.if逻辑表达式 执行语句 end 当逻辑表达式的值为真时,执行该结构中的执行语句,执行完之后继续向下进行;若为假,则跳过结构中的内容,向下执行。 2.if逻辑表达式3.if逻辑表达式1 执行语句1执行语句1 elseelseif逻辑表达式2 执行语句2执行语句2 end… end if-else的执行方式为:如果逻辑表达式的值为真,则执行语句1,然后跳过语句2,向下执行;如果为假,则执行语句2,然后向下执行。 if-elseif的执行方式为:如果逻辑表达式1的值为真,则执行语句1;如果为假,则判断逻辑表达式2,如果为真,则执行语句2,否则向下执行。 例exp2_13.m clc clear forj=1:10 a(j)=j; ifj>5 a(j)=10-j; end end j=1:10; b=a(j)
(四)switch语句 格式:switch表达式(%可以是标量或字符串) case值1 语句1 case值2 语句2 …. otherwise 语句3 end 例exp2_14.m clear clc close t=-pi:0.1:pi; trigname=input('Inputtrigfunctionsname:') switchtrigname case'sin' plot(t,sin(t)) case'cos' plot(t,cos(t)) otherwise break%终止,跳出switch语句 end 执行方式:表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,如果不同,则执行otherwise中的语句。格式中也可以不包括otherwise,这时如果表达式的值与列出的各种情况都不相同,则继续向下执行。 |