资源描述
第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; end dec=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 8.1.2笔记本的启动 1.从Word中启动笔记本 2.从MATLAB中启动笔记本,目录,8.1.3 MATLAB笔记本的界面 MATLAB笔记本的界面和通常的Word界面主要有两点区别: (1)在菜单栏中多了一个Notebook菜单项,笔记本的许多操作都可以通过该菜单项的命令来完成。 (2)在“文件”菜单项下多了一个New M-book命令项。如果在M-book模板下要建立新的M-book文档,可以选择该命令。,目录,8.2 输入单元的定义与执行,8.2.1基本操作 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.自初始化单元的应用,目录,8.2.3单元群及其应用 1.单元群 单元群(Cell Group)是多行输入单元或自初始化单元组成的一个整体。 2.单元群的应用 单元群的用途主要有两个: (1)为保证MATLAB命令结构(如循环结构、条件结构)的完整。 (2)为保证输出结果(如图形)的完整。,目录,8.2.4单元的循环执行 利用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菜单的其他命令,8.5.1整个M-book文档输入单元的执行 Notebook菜单项中的Evaluate M-book命令可以把整个M-book文档中的所有输入单元送到MATLAB中去执行。不管光标处于文档的什么位置,执行总是从文档首部开始。 8.5.2删去M-book文档中所有输出单元 Notebook菜单项中的Purge Output Cells命令可以删去M-book文档中所有输出单元。,目录,8.5.3单元转化为文本 选定单元,再选择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); otherwise error ( Unhandled flag = ,num2str ( flag) ); end function 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),目录,9.7.2离散系统的线性化 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 对上一个问题的回答,目录,
展开阅读全文