MATLAB图形用户界面设计仿真等.ppt
第7章 MATLAB图形用户界面设计,7.1 菜单设计7.2 对话框设计7.3 用户界面设计工具,目录,7.1 菜单设计,7.1.1 用户菜单的建立建立一级菜单项的函数调用形式为:一级菜单项句柄=uimenu(图形窗口句柄,属性名1,属性值1,属性名2,属性值2,)建立子菜单项的函数调用形式为:子菜单项句柄=uimenu(一级菜单项句柄,属性名1,属性值1,属性名2,属性值2,),目录,7.1.2 菜单对象常用属性菜单对象具有Children、Parent、Tag、Type、UserData、Visible等公共属性。除公共属性外,还有一些常用的特殊属性。,目录,例7.1建立“图形演示系统”菜单。菜单条中含有3个菜单项:Plot、Option和Quit。Plot中有Sine Wave和Cosine Wave两个子菜单项,分别控制在本图形窗口画出正弦和余弦曲线。Option菜单项的内容如图7.1所示。其中Grid on和Grid off控制给坐标轴加网格线,Box on和Box off控制给坐标轴加边框,而且这4项只有在画有曲线时才是可选的。Figure Color控制图形窗口背景颜色。Quit控制是否退出系统。,程序如下:screen=get(0,ScreenSize);W=screen(3);H=screen(4);figure(Color,1,1,1,Position,0.2*H,0.2*H,0.6*W,0.4*H,.Name,图形演示系统,NumberTitle,off,MenuBar,none);%定义Plot菜单项hplot=uimenu(gcf,Label,目录,7.1.3 快捷菜单在MATLAB中,可以使用uicontextmenu函数和图形对象的UIContextMenu属性来建立快捷菜单,具体步骤为:(1)利用uicontextmenu函数建立快捷菜单。(2)利用uimenu函数为快捷菜单建立菜单项。(3)利用set函数将该快捷菜单和某图形对象联系起来。,目录,hfigcor=uimenu(hoption,Label,例7.2 绘制曲线y=2e-0.5xsin(2x),并建立一个与之相联系的快捷菜单,用以控制曲线的线型和曲线宽度。程序如下:x=0:pi/100:2*pi;y=2*exp(-0.5*x).*sin(2*pi*x);hl=plot(x,y);hc=uicontextmenu;%建立快捷菜单 hls=uimenu(hc,Label,线型);%建立菜单项 hlw=uimenu(hc,Label,线宽);uimenu(hls,Label,虚线,Call,set(hl,LineStyle,:););uimenu(hls,Label,实线,Call,set(hl,LineStyle,-););uimenu(hlw,Label,加宽,Call,set(hl,LineWidth,2););uimenu(hlw,Label,变细,Call,set(hl,LineWidth,0.5););set(hl,UIContextMenu,hc);%将该快捷菜单和曲线对象联系起来,目录,7.2 对话框设计,7.2.1 对话框的控件(1)按钮(Push Button)。(2)双位按钮(Toggle Button)。(3)单选按钮(Radio Button)。(4)复选框(Check Box)。(5)列表框(List Box)。(6)弹出框(Popup Menu)。(7)编辑框(Edit Box)。(8)滑动条(Slider)。(9)静态文本(Static Text)。(10)边框(Frame)。,目录,7.2.2 对话框的设计 1.建立控件对象 MATLAB提供了用于建立控件对象的函数uicontrol,其调用格式为:对象句柄=uicontrol(图形窗口句柄,属性名1,属性值1,属性名2,属性值2,)其中各个属性名及可取的值和前面介绍的uimenu函数相似,但也不尽相同,下面将介绍一些常用的属性。2.控件对象的属性 MATLAB的10种控件对象使用相同的属性类型,但是这些属性对于不同类型的控件对象,其含义不尽相同。除Children、Parent、Tag、Type、UserData、Visible等公共属性外,还有一些常用的特殊属性。,目录,例7.3 建立数制转换对话框。在左边输入一个十进制整数和216之间的数,单击“转换”按钮能在右边得到十进制数所对应的216进制字符串,单击“退出”按钮退出对话框。程序如下:hf=figure(Color,0,1,1,Position,100,200,400,200,.Name,数制转换,NumberTitle,off,MenuBar,none);uicontrol(hf,Style,Text,Units,normalized,.Position,0.05,0.8,0.45,0.1,Horizontal,center,.String,输 入 框,Back,0,1,1);uicontrol(hf,Style,Text,Position,0.5,0.8,0.45,0.1,.Units,normalized,Horizontal,center,.String,输 出 框,Back,0,1,1);uicontrol(hf,Style,Frame,Position,0.04,0.33,0.45,0.45,.Units,normalized,Back,1,1,0);uicontrol(hf,Style,Text,Position,0.05,0.6,0.25,0.1,.Units,normalized,Horizontal,center,.String,十进制数,Back,1,1,0);uicontrol(hf,Style,Text,Position,0.05,0.4,0.25,0.1,.Units,normalized,Horizontal,center,.String,216进制,Back,1,1,0);he1=uicontrol(hf,Style,Edit,Position,0.25,0.6,0.2,0.1,.Units,normalized,Back,0,1,0);he2=uicontrol(hf,Style,Edit,Position,0.25,0.4,0.2,0.1,.Units,normalized,Back,0,1,0);uicontrol(hf,Style,Frame,Position,0.52,0.33,0.45,0.45,.Units,normalized,Back,1,1,0);ht=uicontrol(hf,Style,Text,Position,0.6,0.5,0.3,0.1,.Units,normalized,Horizontal,center,Back,0,1,0);COMM=n=str2num(get(he1,String);,b=str2num(get(he2,String);,.dec=trdec(n,b);,set(ht,string,dec);uicontrol(hf,Style,Push,Position,0.18,0.1,0.2,0.12,.String,转 换,Units,normalized,Call,COMM);uicontrol(hf,Style,Push,Position,0.65,0.1,0.2,0.12,.String,退 出,Units,normalized,Call,close(hf);,目录,程序调用了trdec.m函数文件,该函数的作用是将任意十进制整数转换为216进制字符串。trdec.m函数文件如下:function dec=trdec(n,b)ch1=0123456789ABCDEF;%十六进制的16个符号 k=1;while n=0%不断除某进制基数取余直到商为0 p(k)=rem(n,b);n=fix(n/b);k=k+1;end k=k-1;strdec=;while k=1%形成某进制数的字符串 kb=p(k);strdec=strcat(strdec,ch1(kb+1:kb+1);k=k-1;enddec=strdec;,目录,例7.4 建立图形演示对话框。在编辑框输入绘图命令,单击“绘图”按钮能在左边坐标轴得到所对应的图形,弹出框提供色图控制,列表框提供坐标网格线和坐标边框控制。程序如下:clf;set(gcf,Unit,normalized,Position,0.2,0.3,0.65,0.35);set(gcf,Menubar,none,Name,图形演示,NumberTitle,off);axes(Position,0.05,0.15,0.55,0.7);uicontrol(gcf,Style,text,Unit,normalized,.Posi,0.63,0.85,0.2,0.1,String,输入绘图命令,Horizontal,center);hedit=uicontrol(gcf,Style,edit,Unit,normalized,Posi,0.63,0.15,0.2,0.68,.Max,2);%Max取2,使Max-Min1,从而允许多行输入 hpopup=uicontrol(gcf,Style,popup,Unit,normalized,.Posi,0.85,0.8,0.15,0.15,String,Spring|Summer|Autumn|Winter);hlist=uicontrol(gcf,Style,list,Unit,normalized,.Posi,0.85,0.55,0.15,0.25,String,Grid on|Grid off|Box on|Box off);hpush1=uicontrol(gcf,Style,push,Unit,normalized,.Posi,0.85,0.35,0.15,0.15,String,绘 图);uicontrol(gcf,Style,push,Unit,normalized,.Posi,0.85,0.15,0.15,0.15,String,关 闭,Call,close all);set(hpush1,Call,COMM(hedit,hpopup,hlist);set(hlist,Call,COMM(hedit,hpopup,hlist);set(hpopup,Call,COMM(hedit,hpopup,hlist);COMM.m函数文件:function COMM(hedit,hpopup,hlist)com=get(hedit,String);n1=get(hpopup,Value);n2=get(hlist,Value);if isempty(com)%编辑框输入非空时 eval(com);%执行从编辑框输入的命令 chpop=spring,summer,autumn,winter;chlist=grid on,grid off,box on,box off;colormap(eval(chpopn1);eval(chlistn2);end,目录,7.3 用户界面设计工具,7.3.1 图形界面控制面板 7.3.2 属性编辑器 7.3.3 事件过程编辑器 7.3.4 菜单编辑器 7.4.5 位置调整工具,目录,例7.5 利用界面设计工具设计用户界面。具体要求是:(1)在编辑框输入形成数据z的命令,然后选择三个按钮中的一个,即可绘制出z的图形。(2)选择弹出框中的某个色图,能及时地更改绘图的颜色。(3)在图形窗口缺省的菜单条上添加一个菜单项Options,Options下又有两个子菜单项White和Red,选中White项时,图形窗口将变成白色,选中Red项时,图形窗口将变成红色。操作步骤如下:(1)打开图形界面控制面板,添加有关图形对象。(2)利用属性编辑器,设置图形对象的属性。(3)添加Options菜单项。,目录,第8章 MATLAB笔记本,8.1 笔记本的安装及启动8.2 输入单元的定义与执行8.3 计算区的定义与执行8.4 输出格式控制8.5 Notebook菜单的其他命令8.6 M-book模板样式的修改,目录,8.1 笔记本的安装及启动,8.1.1 笔记本的安装在MATLAB命令窗口输入:notebook-setup笔记本的启动1.从Word中启动笔记本2.从MATLAB中启动笔记本,目录,8.1.3 MATLAB笔记本的界面MATLAB笔记本的界面和通常的Word界面主要有两点区别:(1)在菜单栏中多了一个Notebook菜单项,笔记本的许多操作都可以通过该菜单项的命令来完成。(2)在“文件”菜单项下多了一个New M-book命令项。如果在M-book模板下要建立新的M-book文档,可以选择该命令。,目录,8.2输入单元的定义与执行,基本操作1.输入单元的定义首先选中所需命令,然后在Notebook菜单项中选择Define Input Cell命令,于是被选中的MATLAB命令成为输入单元。也可以在选中所需命令后,直接按组合键Alt+D。2.输入单元的执行选择Notebook菜单项中的Evaluate Cell命令或直接按组合键Ctrl+Enter。3.输出单元 输入单元执行后产生输出单元。,目录,例8.1定义并执行输入单元。操作步骤如下:(1)在文档中输入MATLAB命令。(2)选中命令行,在Notebook菜单项中选Define Input Cell命令或直接按组合键Alt+D,于是命令行就变成了“绿色”的输入单元。(3)若要把输入单元送去执行,则可用Notebook菜单项中的Evaluate Cell命令或直接按组合键Ctrl+Enter,执行后产生“蓝色”的输出单元:,目录,4.输入单元定义与执行同时进行 先选中MATLAB命令,然后从Notebook菜单项中选择Evaluate Cell命令或直接按组合键Ctrl+Enter,不但使被选中的命令成为输入单元,而且送去执行,产生输出单元。例8.2输入单元定义与执行同时进行。在英文状态下,以文本方式键入命令,然后选中命令并按Ctrl+Enter键,则得到输入、输出单元。,目录,8.2.2 自初始化单元及其应用1.自初始化单元选择Notebook菜单中的Define AutoInit Cell命令即可。2.自初始化单元的应用,目录,单元群及其应用1.单元群单元群(Cell Group)是多行输入单元或自初始化单元组成的一个整体。2.单元群的应用单元群的用途主要有两个:(1)为保证MATLAB命令结构(如循环结构、条件结构)的完整。(2)为保证输出结果(如图形)的完整。,目录,单元的循环执行利用Notebook菜单中的Evaluate Loop命令可实现单元的循环执行。,目录,8.3 计算区的定义与执行,定义计算区的方法是:先选定包含普通Word文本、输入单元和输出单元的一个连续区,然后选择Notebook菜单中的Define Calc Zone命令。一旦计算区被定义后,不管光标在计算区的什么位置,只要选择Notebook菜单中的Evaluate Calc Zone命令即可执行计算区中的全部输入单元,且在每个输入单元后面以输出单元形式给出相应的计算结果。,目录,8.4 输出格式控制,可以通过Notebook菜单中的Notebook Options命令来实现。选择该命令后,会弹出输出格式控制对话框,以后的操作都是针对该对话框进行。,目录,8.4.1 输出数据格式控制1.输出数据的表示方式2.输出数据间的空行控制 8.4.2 输出图形格式控制利用输出格式控制对话框,也可以实现对输出图形的控制。1.图形镶嵌的控制2.曲面图色彩控制3.图形背景色的控制4.图形大小的控制,目录,8.5 Notebook菜单的其他命令,整个M-book文档输入单元的执行Notebook菜单项中的Evaluate M-book命令可以把整个M-book文档中的所有输入单元送到MATLAB中去执行。不管光标处于文档的什么位置,执行总是从文档首部开始。删去M-book文档中所有输出单元Notebook菜单项中的Purge Output Cells命令可以删去M-book文档中所有输出单元。,目录,单元转化为文本选定单元,再选择Notebook菜单中的Undefine Cells命令。或将光标置于单元之中,按组合键AltU。当某输入单元或单元群被转化为文本时,与之相应的输出单元也被自动转化为文本。,目录,8.6 M-book模板样式的修改,同其他Word模板一样,用户既可以修改M-book模板原有样式,也可以加入新样式。例如,现有的M-book模板中,输入单元是绿色的,输出单元和自初始化单元是蓝色的,错误单元是红色的。现在可以把输出单元的颜色变为黑色。,目录,第9章 MATLAB环境下的仿真软件Simulink,9.1 Simulink的基本操作9.2 Simulink的几类基本模块9.3 仿真模型参数的设置9.4 子系统的建立与封装9.5 在命令窗口中创建模型9.6 S-函数的设计和应用9.7 仿真系统的线性化分析,目录,9.1 Simulink的基本操作,9.1.1 Simulink的启动与退出 1.Simulink的启动 启动Simulink的方法有3种:(1)在MATLAB的命令窗口直接键入simulink。(2)单击MATLAB命令窗口工具栏上的Simulink模块库浏览器命令按钮。(3)在MATLAB命令窗口File菜单中选择New菜单项下的Model命令。2.Simulink的退出 为了退出Simulink,只要关闭所有模型窗口和Simulink模块库窗口即可。,目录,9.1.2 Simulink模块的操作1.选取模块2.复制与删除模块3.模块的参数和属性设置4.模块外形的调整 5.模块名的处理6.模块的连接7.在连线上反映信息。,目录,9.2 Simulink的几类基本模块,9.3 仿真模型参数的设置9.3.1 通过菜单命令设置仿真模型参数 选择模型窗口Simulation菜单中的Parameter命令,将出现仿真参数对话框。对话框分四个选项卡:Solver(算法)、Workspace I/O(工作空间输入输出)、Diagnostics(诊断)和Real-Time Workshop(实时工作间)。,目录,9.3.2 在命令窗口调用函数设置仿真模型参数1.sim 函数 其调用格式为:t,x,y=sim(modname,timespan,options,data);2.simset函数 它有如下4种用法:(1)options=simset(property,value,)(2)options=simset(old_opstruct,property,value,)(3)options=simset(old_opstruct,new_opstruct)(4)simset,目录,例9.1以图9.15所示的仿真模型为例,说明simset函数的用法。(1)在命令窗口输入命令:option=simset(OutputVariables,x,OutputPoints,all,FinalstateName,date);t,x,y=sim(mode1,1,10,option)(2)在命令窗口中输命令:optionl=simset(OutputVariables,xy,OutputPoints,all);t,x,y=sim(Simul,2,4,6,8,option1);,目录,3.simget函数该函数有如下3种用法:(1)struct=simget(model)(2)value=simget(model,property)(3)value=simget(Option,Structure,property)4.set_param函数(1)设置仿真参数调用格式为:set_param(mode,property,value,)(2)控制仿真进程调用格式为:set_param(mode,SimulationCommand,cmd),目录,例9.2 假设从实际应用领域(力学、电学、生态或社会)中,抽象出有初始状态为0的二阶微分方程x+0.2x+0.4x=0.2u(t),u(t)是单位阶跃函数。用积分器直接构造求解微分方程的模型exm1.mdl。步骤如下:(1)改写微分方程。把原方程改写为:x=0.2u(t)-0.2x-0.4x(2)利用Simulink模块库中的标准模块构作模型。(3)仿真操作。(4)保存在MATLAB工作空间中的数据。,目录,例9.3利用传递函数模块建模。步骤如下:(1)根据系统传递函数构造系统模型(2)仿真操作。例9.4利用状态方程模块建模。(1)利用构造仿真模型(2)仿真,目录,9.4 子系统的建立与封装,9.4.1 子系统的建立1.通过Subsystem模块建立子系统操作步骤为:(1)先打开Simulink模块库浏览器,新建一个仿真模型。(2)打开Simulink模块库中的Signals&Systems模块库,复制Subsystem模块到新的模型窗口中。(3)用鼠标左键双击Subsystem模块打开一个空白的Subsystem窗口,将要组合的模块添加到该窗口中,另外还要根据需要复制一个或多个Input和Output模块,表示子系统的输入和输出端口。这样,一个子系统就建好了。,目录,2.通过已有的模块建立子系统操作步骤为:(1)先选择要建立子系统的模块,不包括输入端口和输出端口。(2)选择模型窗口Edit菜单中的Create Subsystem 命令,这样,子系统就建好了。在这种情况下,系统会自动把Input模块和Output模块添加到子系统中,并把原来的模块变为子系统的图标。,目录,9.4.2 子系统的条件执行1.使能子系统建立使能子系统的方法是:打开Simulink模块库中的Signals&Systems模块库,将Enable模块复制到子系统模型中,则系统的图标发生了变化。,目录,例9.5利用使能原理构成一个正弦半波整流器。操作步骤如下:(1)打开Simulink模块库浏览器以及新建一个模型窗口。(2)双击空子系统模块Subsystem,打开其结构模型窗。(3)将Simulink浏览库中的In输入口模块、Out输出口模块、Enable使能模块拖至子系统的结构模型窗;把In模块的输出直接送到Out模块的输入端;Enable模块无须进行任何连接,且采用它的缺省设置实现题目所需使能子系统。(4)完成新建模型窗口中各模块间的连接并存盘。(5)双击示波器模块,打开显示窗。然后选择Simulink菜单中的Start命令,就可看到半波整流波形。,目录,2.触发子系统触发子系统是指当触发事件发生时开始执行子系统。与使能子系统相类似,触发子系统的建立要把Signals&Systems模块库中的Trigger模块拷贝到子系统中。,目录,例9.6 利用触发子系统原理将一锯齿波转换成方波。操作步骤如下:(1)用Signal Generator、Subsystem和Scope模块构成一子系统,双击Signal Generator模块图标在Wave from的下拉列表框中选择sawtooth,即锯齿波。(2)将上例中的Enable模块换成Trigger触发模块。双击该模块并选Trigger type触发事件形式为either,即上跳沿或下跳没触发。(3)完成新建模型窗口中各模块间的连接,并存盘。(4)双击示波器模块,然后选择Simulink菜单中的start命令,就可看到方波。,目录,3.使能加触发子系统所谓使能加触发子系统就是把Enable和Tirgger模块都加到子系统中,使能控制信号和触发控制信号共同作用子系统的执行,也就是前两种子系统的综合。该系统的行为方式与触发子系统相似,但只有当使能信号为正时,触发事件才起作用。,目录,9.4.3 子系统的封装 子系统的封装过程很简单:先选中所要封装的子系统,再选择模型窗口Edit菜单中的Mask Subsystem命令,这时将出现Mask Editor对话框。Mask Editor对话框中共包括3个选项卡:Icon、Initialization和Documentation。子系统的封装主要就是对这3页参数进行设置。,目录,9.5 在命令窗口中创建模型,9.5.1 构造模型的命令9.5.2 设置参数,目录,9.6 S-函数的设计和应用,9.6.1 S-函数概述9.6.2 用M文件编写S-函数(1)MATLAB5.3为用户提供了一个模板,只要在必要的子程序里编写代码并输入参数就可以了。(2)从Function&Tables子库里把S-Function系统的功能模块复制过来,输入程序的文件名,以供调用。,目录,例9.7利用M文件来写一个限幅积分器的S-函数,并借助S-函数模块来调用此文件。限幅积分器的数学模型如下:操作步骤如下:(1)根据数学模型,编写S-函数sfun97.m。function sys,x0,str,ts=sfun97(t,x,u,flag,lb,ub,xi)switch flag,case 0,sys,x0,srt,ts=mdlInitializeSizes(xi);case 1,sys=mdlDerivatives(t,x,u,lb,ub);case 2,sys=mdlUpdate(t,x,u);case 3,sys=mdlOutputs(t,x,u);case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);case 9,sys=mdlTerminate(t,x,u);otherwiseerror(Unhandled flag=,num2str(flag);endfunction sys,x0,str,ts=mdlInitializeSizes(xi)sizes=simsizes;sizes.NumContStates=1;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=0;sizes.NumSampleTimes=1;sys=simsizes(sizes);xo=xi;str=;ts=0,0;function sys=mdlDerivatives(t,x,u,lb,ub)if(x=ub,目录,(2)完成S-函数的编写后,接着建立 Simulink模型,将功能模块S-function复制到设计区域,打开其参数页,输入S-函数的文件名sfun97.m和S-函数的参数lb、ub、xi。(3)编写主程序。clear;lb=-0.5;ub=0.5;xi=0;sim(sfun97);(4)在命令窗口运行主程序,并双击示波器,即可查看到输入波形及限幅积分的结果。,目录,9.7 仿真系统的线性化分析,9.7.1 连续系统的线性化线性化分析函数linmod用来提取非线性系统的近似线性模型,也可以用来获取线性系统的数学模型。linmod函数的调用格式为:A,B,C,D=linmod(sys)A,B,C,D=linmod(sys,x,u)A,B,C,D=linmod(sys,x,u,pert)A,B,C,D=linmod(sys,x,u,pert,xpert,upert),目录,离散系统的线性化 dlinmod能够以任意给定的采样时间对离散系统、多速率系统以及连续和离散混合系统进行线性化。除了第2个选项需要插入采样时间来对系统线性化外,dlinmod的调用格式和linmod是相同的:A,B,C,D=dlinmod(sys,Ts,x,u),目录,9.7.4 平衡分析在给定输入、输出及状态条件下,Simulink提供的函数trim可以用来确定系统的稳态平衡点。其调用格式为:x,u,y,dx=trim(sys)x,u,y,dx=trim(sys,x0,u0,y0,ix,iu,iy)其中x,u,y,dx分别代表状态向量、输入向量、输出向量和状态向量的导数。sys是模型名。x0,u0,y0分别为状态向量x、输入向量u和输出向量y的初始猜测值,它们的输入格式必须是列向量形式。ix是向量,它的元素是那些在寻找过程中,要求保持其值固定不变(等于初始猜测值)的那些状态变量的序号。iu、iy与ix类似,分别适用于u和y。,目录,MATLAB使用注意项,101 脚本文件和函数文件102 函数调用和参数传递103 M文件的调试 4 环境设置 10.5 MATLAB使用中的常用命令,目录,101 脚本文件和函数文件,1011 M脚本文件,对于一些比较简单的问题,在指令窗中直接输入指令计算。,对于复杂计算,采用脚本文件(Script file)最为合适。,MATLAB只是按文件所写的指令执行。,M脚本文件的特点是:,脚本文件的构成比较简单,只是一串按用户意图排列而成的(包括控制流向指令在内的)MATLAB指令集合。,脚本文件运行后,所产生的所有变量都驻留在 MATLAB基本工作空间(Base workspace)中。只要用户不使用清除指令(clear),MATLAB指令窗不关闭,这些变量将一直保存在基本工作空间中。,M文件有两种形式:脚本文件(Script File)和函数文件(Function File)。这两种文件的扩展名,均为“.m”。,目录,1012 M函数文件,与脚本文件不同,函数文件犹如一个“黑箱”,把一些数据送进并经加工处理,再把结果送出来。,MATLAB提供的函数指令大部分都是由函数文件定义的。,M函数文件的特点是:,从形式上看,与脚本文件不同,函数文件的笫一行总是以“function”引导的“函数申明行”。,从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就会专门为它开辟一个临时工作空间,称为函数工作空间(Function workspace)。当执行文件最后一条指令时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被清除。,MATLAB允许使用比“标称数目”较少的输入输出宗量,实现对函数的调用。,目录,1013 M文件的一般结构,由于从结构上看,脚本文件只是比函数文件少一个“函数申明行”,所以只须描述清楚函数文件的结构。,典型 M函数文件的结构如下:,函数申明行:位于函数文件的首行,以关键字 functio 开头,函数名以及函数的输入输出宗量都在这一行被定义。,笫一注释行:紧随函数申明行之后以%开头笫一注释行。该行供lookfor关键词查询和 help在线帮助使用。,在线帮助文本区:笫一注释行及其之后的连续以%开头的所有注释行构成整个在线帮助文本。,编写和修改记录:与在线帮助文本区相隔一个“空”行,也以%开头,标志编写及修改该M文件的作者和日期等。,函数体:为清晰起见,它与前面的注释以“空”行相隔。,目录,102 函数调用和参数传递,1021 局部变量和全局变量,局部(Local)变量:它存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身。,全局(Global)变量:通过 global 指令,MATLAB也允许几个不同的函数空间以及基本工作空间共享同一个变量,这种被共享的变量称为全局变量。,1022 函数调用,在MATLAB中,调用函数的常用形式是:,输出参数1,输出参数2,=函数名(输入参数1,输入参数2,),函数调用可以嵌套,一个函数可以调用别的函数,甚至调用它自己(递归调用)。,目录,1023 参数传递,MATLAB在函数调用上有一个与众不同之处:函数所传递的参数具有可调性。,传递参数数目的可调性来源于如下两个MATLAB永久变量:,函数体内的 nargin 给出调用该函数时的输入参数数目。,函数体内的 nargout 给出调用该函数时的输出参数数目。,只要在函数文件中包括这两个变量,就可以知道该函数文件调用时的输入参数和输出参数数目。,值得注意:nargin、nargout 本身都是函数,不是变量,所以用户不能赋值,也不能显示。,“变长度”输入输出宗量:varargin、varrgout。具有接受“任意多输入”、返回“任意多输出”的能力。,跨空间变量传递:evalin。,(参考:circle.m,am1.m),目录,103 M文件的调试,编写 M文件时,错误(Bug)在所难免。错误有两种:语法(Syntax)错误和运行(Run-time)错误。,语法错误是指变量名、函数名的误写,标点符号的缺、漏等。对于这类错误,通常能在运行时发现,终止执行,并给出相应的错误原因以及所在行号。,运行错误是算法本身引起的,发生在运行过程中。相对语法错误而言,运行错误较难处理。尤其是M函数文件,它一旦运行停止,其中间变量被删除一空,错误很难查找。,有两种调试方法:直接调试法和工具调试法。,目录,直接调试法:可以用下面方法发现某些运行错误。,在M文件中,将某些语句后面的分号去掉,迫使M文件输出一些中间计算结果,以便发现可能的错误。,在适当的位置,添加显示某些关键变量值的语句(包括使用 disp 在内)。,利用 echo 指令,使运行时在屏幕上逐行显示文件内容。echo on 能显示M脚本文件;echo FunNsme on 能显示名为FunNsme 的M函数文件。,在原M脚本或函数文件的适当位置,增添指令 keyboard。keyboard 语句可以设置程序的断点。,通过将原M函数文件的函数申明行注释掉,可使一个中间变量难于观察的M函数文件变为一个所有变量都保留在基本工作空间中的M脚本文件。,目录,GUI 界面调试法:,MATLAB 5.x 版提供了一个基于GUI界面的调试。使用它,可以对函数进行调试。,Debug菜单的使用:,Continue:恢复程序运行至结束或另一个断点。,Single Step:单步执行函数。,Step In:深入下层局部工作区。,Quit Debugging:退出调试状态。,Set/Clear Breakpoint:设置/清除光标处的断点。,Clear All Breakpoints:清除程序中的所有断点。,Stop if Error:运行至出错或结束。,Stop if Warning:运行至警告消息或结束。,Stop if NaN of Inf:运行至运算结果出现 NaN 或 Inf。,目录,104 环境设置,每次MATLAB遇到一个命令(例如test)时,其处置程序为:1.将test视为使用者定义的变数。2.若test不是使用者定义的变数,将其视为永久常数。3.若test不是永久常数,检查其是否为目前工作目录下 的M档案。4.若不是,则由搜寻路径寻找是否有test.m的档案。5.若在搜寻路径中找不到,则MATLAB会发出哔哔声并 印出错误讯息。,目录,假设test.m所在的目录是d:mlbook。如果不先进入这个目录,MATLAB就找不到你要执行的M档案。如果希望MATLAB不论在何处都能执行 test.m,那麽就必须将d:mlbook加入MATLAB的搜寻路径(Search path)上。要检MATLAB的搜寻路径,键入path即可:,要将d:mlbook加入MATLAB的搜寻路径,还是使用path命令:path(path,c:datamlbook);,目录,105 MATLAB使用中的常用命令,Close 关闭窗口命令Clear 清除变量赋值Ans 对上一个问题的回答,目录,