第3章 MATLAB程序设计.ppt_第1页
第3章 MATLAB程序设计.ppt_第2页
第3章 MATLAB程序设计.ppt_第3页
第3章 MATLAB程序设计.ppt_第4页
第3章 MATLAB程序设计.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

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

文档简介

1、第三章 MATLAB程序设计,3.1 M文件编辑器 3.2 M文件类型与运行机理 3.3 MATLAB程序控制流 3.4 M函数类型 3.5 M函数使用方法 3.6 数据I/O与文件操作 3.7 程序调试与性能优化,3.1 M文件编辑器,M文件编辑器的启动: 在MATLAB指令窗运行命令edit 点击MATLAB工具栏上的“新建”图标 在MATLAB菜单中选择FileNew“M-file” 打开已经存在的M文件: 在MATLAB指令窗运行命令edit filename 点击MATLAB工具栏上的“打开”图标 在MATLAB菜单中选择FileOpen 编辑M文件: M文件是文本文件,后缀名必须是

2、.m M文件可以用任何文本编辑工具创建和编辑 文本编辑工具最好具有语法检测功能,3.2 M文件类型与运行机制,3.2.1 M脚本文件 M脚本文件只是一串按用户意图排列而成的(包括控制流向指令在内的)MATLAB指令集合 脚本文件运行后,所产生的所有变量都驻留在MATLAB基本工作空间中 只要用户不使用clear指令加以清除,且MATLAB指令窗口不关闭,这些变量将一直保存在基本工作空间 基本工作空间随MATLAB的启动而产生,只有关闭MATLAB,该基本空间才能被删除 脚本文件不允许有输入参数和输出参数,3.2 M文件类型与运行机制,3.2.2 M函数文件 M函数文件的第一行是以functio

3、n引导的函数声明行,该行还罗列函数与外界联系的全部输入输出参数 每当函数文件运行时,MATLAB就专门为它开辟一个临时的函数工作空间,所有中间变量都存放在函数工作空间中 当执行完文件最后一条指令时,或遇到return,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被删除 函数空间随具体M函数文件的被调用而产生,随调用结束而删除 函数空间相对基本空间是独立的、临时的,在MATLAB整个运行期间,可以产生任意多个临时函数空间 如果在函数文件中发生对某脚本文件的调用,那么该脚本文件运行产生的所有变量都存放于函数空间,而不存放在基本空间 如果从组成程序结构的角度来看,M函数文件仅比

4、M脚本文件多出一个函数声明行,其它部分完全一样,3.2 M文件类型与运行机制,3.2.3 M函数文件的一般结构 函数声明行: H1行: 在线帮助文本区: 编写和修改记录: 函数体: 注释:,function x=myfun(y) %MYFUN %我的第一个函数 %调用格式: %x=myfun(y) %2009年4月14日编写 %计算y的平方 x=y2;,3.2 M文件类型与运行机制,3.2.4 局部变量和全局变量 局部变量(Local variable) 存在于函数空间内部的中间变量 产生于该函数的运行过程中 其影响范围仅限于该函数本身 全局变量(Global variable) 不同的函数空

5、间以及基本工作空间共享的变量 每个希望共享变量的空间都必须用global声明全局变量 没采用global定义的空间无权享用全局变量 如果某个空间的操作使全局变量的内容发生变化,那么其他空间中的同名变量也随之变化 除非与全局变量联系的所有空间都被删除,否则全局变量依然存在 对全局变量的定义必须在该变量被使用之前进行 为了提高M文件的可读性,建议用大写字母命名全局变量 由于全局变量损害函数的封装性,因此不提倡使用全局变量,3.2 M文件类型与运行机制,3.2.5 P码文件 语法分析过程和伪代码 一个M文件首次被调用时,MATLAB首先对该M文件进行语法分析,并把生成的相应内部伪代码文件存放在内存中

6、 再次调用该M文件时,将直接调用该文件在内存中的P码文件,而不会对原码文件重复进行语法分析 P码文件与原码文件有相同的文件名,但扩展名是.p P码文件运行速度高于原码文件 如果存在同名的P码和原码文件,那么当该文件名被调用时,被执行的肯定是P码文件 P码文件的预生成 pcode FunName:在当前目录上生成FunName.p pcode FunName inplace:在FunName.m所在目录上生成FunName.p,3.2 M文件类型与运行机制,3.2.6 MATLAB的搜索过程 如果MATLAB在一个文件中遇到指令cow其搜索过程如下: 检查cow是否为一个变量名;如果不是,执行下

7、一步 检查cow是否内建函数;假如不是,执行下一步 检查cow是不是cow所在的M文件中的一个子函数;如果不是,再往下执行 检查cow是不是cow所在的M文件中的一个私有函数;假如不是,再往下执行 检查cow是不是当前目录上的文件;假如不是,再往下执行 检查搜索路径上是否有cow存在 MATLAB将使用最先找到的那个cow 如果一直找不到cow,MATLAB就给出错误信息,3.3 MATLAB程序控制流,3.3.1 for循环控制结构 格式: 说明: x:循环变量,依次取array各列 commands:循环体 重复执行次数由array的列数决定 for循环结构可以嵌套 array可以是任何合

8、法的MATLAB数组 循环不会因为在循环体内对循环变量重新设置新值而中断 为了得到高效代码,应尽量提高代码的向量化程度,而避免使用循环结构 为了得到高效代码,在循环指令之前应尽量对数组进行预定义,for xarray (commands) end,3.3 MATLAB程序控制流,3.3.2 while循环结构 格式: 说明: commands:循环体 首先检测expression的值,如其为逻辑真,则执行循环体内的命令,直到expression的值为逻辑假时退出循环 如果expression的值是数组,则只有在数组中所有元素均为真时才执行循环体 while循环与for循环的区别是执行循环体的次

9、数能否预先确定 如果expression的值为空数组,则MATLAB认为表达式值为假,而不执行循环体,while expression (commands) end,3.3 MATLAB程序控制流,3.3.3 ifelseend分支结构 格式: 一种选择 两种选择 多种选择 说明 表达式有时由多个逻辑子表达式组成,MATLAB将尽可能少地检测这些子表达式的值 if指令判决和break指令的配合使用,可以强制终止for循环和while循环,if expression (commands) end,if expression (commands) else (commands) end,if ex

10、pression1 (commands) elseif expression2 (commands) else (commands) end,3.3 MATLAB程序控制流,3.3.4 switch-case结构 格式: 说明: ex应为标量或字符串 检测值testk类型可以是标量或字符串,也可以是元胞数组 与C语言不同,在执行完每个case块后,MATLAB会自动跳出switch结构,无需使用break指令,switch ex case test1 (commands) case test2 case testk (commands) otherwise (commands) end,3.3

11、 MATLAB程序控制流,3.3.5 try-catch结构 格式 说明: 只有当执行命令组1出现错误后,命令组2才会被执行 可调用lasterr函数查询出错原因 如果lasterr的运行结果是一个空串,则表明命令组1被成功执行 当执行命令组2时又出错,MATLAB将终止该结构,try (commands1) catch (commands2) end,3.3 MATLAB程序控制流,3.3.6 其它常用指令 1.return:强制结束执行函数并把控制转出 2.input:将控制权“暂时”交给用户 v=input(message):将用户键入内容赋给v v=input(message,s):将

12、用户键入内容作为字符串赋给v 3.keyboard:将控制权交给键盘 用户可以输入各种合法指令 用户输入return指令后控制权交还给程序 4.v=yesinput(Prompt,Default,Possib) 5.pause:暂停执行文件,等待用户按任意键继续 6.break:使包含该指令的while、for循环终止 7.continue:结束当前循环,开始下一次循环 8.error和warning指令: error(message):显示出错信息,终止程序 warning(message):显示警告信息,程序继续运行 errortrap:错误发生后,程序继续执行与否的双位开关,3.4 M函

13、数类型,3.4.1 子函数和私有函数 主函数与子函数: 定义:M函数文件中第一个出现的函数称为主函数,该文件中的其他函数称为子函数 保存时函数文件名与主函数定义名相同,外部函数只能调用主函数 主函数位置不可改变,子函数排列顺序任意 子函数的优先级仅次于内建函数 主函数与子函数的工作空间彼此独立 私有函数: 定义:位于private目录上的M函数文件 私有函数只能被private直接父目录上的M文件调用 私有函数的优先级次于子函数,优于其他类型的函数 子函数和私有函数不能直接被help、lookfor等指令搜索有关帮助信息,3.4 M函数类型,3.4.2 嵌套函数 在函数体内部定义的函数,包含M

14、文件的基本元素,以end表示结束 可以在一个函数内部定义多个嵌套函数,也可以使用多重嵌套 函数可以调用自己函数体中的嵌套函数,但不能调用嵌套函数内部更深层次的嵌套函数 同级函数可以相互调用,也可以调用比自己低一级的嵌套函数 嵌套函数拥有自己的工作空间,但是它有权限访问其所嵌套地方的所有函数的工作空间 被主函数赋值的变量可以被主函数中任意一个嵌套函数访问,嵌套函数的变量值也可以被任何包含它的函数访问 由嵌套函数返回的变量不包含在外部函数中 使用函数句柄可以使得在函数的作用域之外也可以访问这个函数,但是函数的句柄必须在函数作用域内被创建 嵌套函数在同一个M文件中与其他函数共享非全局变量,3.4 M

15、函数类型,3.4.3 内联函数 内联函数的创建: inline(CE):把串表达式转化为输入参数自动生成的内联函数 inline(CE,arg1,arg2,):把串表达式转化为arg1,arg2指定输入参数的内联函数 inline(CE,n):把串表达式转化为x,P1,P2,Pn等指定参数的内联函数 涉及内联函数性质的指令: class(inlinefun):给出内联函数类型 char(inlinefun):给出内联函数计算公式 argnames(inlinefun):给出内联函数的输入参数 vectorize(inlinefun):使内联函数适用“数组运算”规则,3.4 M函数类型,3.4.

16、4 匿名函数 语法格式及其说明: fhandle=(arglist)expression expression:函数体 arglist:输入参数列表 使用方法: arglist可以是一个参数,也可以是多个参数 匿名函数也可以没有任何输入参数,但后面的括号必须保留 调用没有输入参数的匿名函数同样要带括号,否则MATLAB仅仅识别此句柄,而不会调用此函数 可以建立匿名函数数组,用元胞数组存储 在函数定义中使用空格要慎重 与其他函数一样,匿名函数返回的输出参数个数决定于等号左边的参数个数,3.5 M函数使用方法,3.5.1 函数调用语法 命令行调用: 格式:funname in1 in2 inN 缺

17、点:不能为函数的返回参数赋值 函数式调用: 格式:out1,out2,outN=funname(in1,in2,inN) 输入输出参数都可以变化 命令/函数两重性: 格式1:funname in1 in2 inN 格式2:funname(in1,in2,inN),3.5 M函数使用方法,3.5.2 输入输出参数检测 检测指令: nargin:在函数体内,用于获取实际输入参数数目 nargout:在函数体内,用于获取实际输出参数数目 nargin(fun):获取fun指定函数的标称输入参数数目 nargin(fun):获取fun指定函数的标称输出参数数目 inputname(n):在函数体内使用

18、,给出第n个输入参数的实际调用变量名 说明: 在函数体内使用nargin、nargout的目的是与程序流控制指令配合,对于不同数目的输入输出参数,函数可以完成不同的任务 nargin、nargout、inputname本身都是函数,而不是变量,因此用户不能使用赋值指令对它们进行处理,3.5 M函数使用方法,3.5.3 变长度输入输出参数 格式: 说明: varargin:变长度输入参数列表 varargout:变长度输出参数列表 varargin、varargout本身都是元胞数组 M函数文件被调用时,函数首先将输入变量依先后顺序逐个对应分配给列表中明确定义的普通输入参数,然后把剩余的输入变量

19、依次逐个分配到varargin元胞数组的元胞中。 所谓变长度,就是varargin的长度随分配到的输入参数个数而变 在编写M函数文件时,varargin的每个元胞应当作一个普通输入参数 varargout的工作机理、规则与varargin相同,function outpars,varargout=funname(inputpars,varargin),3.5 M函数使用方法,3.5.4 跨空间变量传递 跨空间计算串表达式的值 evalin(workspace,expression) evalin(workspace,expression1,expression2) workspace可取bas

20、e和caller 跨空间赋值 assign(workspace,VN,x),3.5 M函数使用方法,3.5.5 串演算函数 eval指令: y=eval(CEM) y=eval(CEM1,CEM2) y1,y2=eval(CEM) CEM必须为字符串 CEM可以是MATLAB任何合法表达式 feval指令: y1,y2=feval(FN,arg1,arg2) FN只能是函数名 feval比eval运行效率高,3.5 M函数使用方法,3.5.6 函数句柄 函数句柄的创建和观察 函数句柄创建: 利用符号,或利用转换函数str2func 被创建句柄的函数文件必须在当前视野范围内 定义函数句柄时,所指

21、定的函数名不应包括路径信息,也不应该包括扩展名 函数句柄内涵观察:functions functions函数只能接受(11)函数句柄数组, 返回一个单构架,包含若干个域,以记录函数的各种信息,3.5 M函数使用方法,函数句柄的用法 通过函数句柄执行相应函数的计算 数值计算 符号计算 泛函指令调用 无效函数句柄 无效函数句柄的产生:如果函数不在当前视野内,所创建的函数句柄无效,此时MATLAB既不会发布“出错”信息,也不会警告 class,size,who等指令只能表明函数句柄的存在,但无法判断函数句柄的有效性 函数句柄的有效性可以用feval等指令检验,3.6 数据I/O与文件操作,3.6.1

22、 文件类型与相应操作 文本文件: MATLAB工作空间: MAT文件 逗号分隔的数字:csvread(fname.csv) 定界符分隔的文本:dlmread(fname.dlm) TAB键分隔的文本:dlmread(fname.tab) 科学数据: 普通格式的数据:cdfread(fname.cdf) 可变的图像传输系统数据:fitsread(fname.fits) 层次格式的数据:hdfread(fname.hdf) 表单数据: Excel表单:xlsread(fname.xls) Lotus123表单:wk1read(fname.wk1) 多媒体文件: 图像:imread(fname.xx

23、x) 音频:auread(fname.au),wavread(fname.wav) 视频:aviread(fname.avi),3.6 数据I/O与文件操作,3.6.2 MAT文件及其操作 MAT文件的特点 MAT文件是MATLAB中特有的一种二进制文件 MAT文件是MATLAB与外部接口进行数据交换的媒介 MAT文件可以跨平台使用 数据的导出 save:将MATLAB 工作空间所有变量存储在当前目录下的matlab.mat文件中 save var1 var2 varn:将n个变量保存在matlab.mat文件中 save fname var1 var2 varn:将n个变量保存在fname.

24、mat文件中 数据的导入 load:加载MATLAB找到的第一个matlab.mat文件中的所有变量到MATLAB工作空间中 load fname var1,var2,varn:加载fname.mat文件中的n个指定名称的变量 判断数据文件是否存在:exist(fname,file) 判断数据文件中有哪些变量:whos file fname.mat 数据文件的删除:delete fname.mat,3.6 数据I/O与文件操作,3.6.3 使用导入向导(Import Wizard) 导入向导的启动: 命令行启动:uiimport file 剪贴板导入数据:uiimport pastespeci

25、al 菜单栏启动:FileImport Data 导入文本文件: 行由文件的换行符划分,列由用户指定 分隔符类型:逗号、空格、制表符、分号、自定义 导入数据组成:data、textdata、rowheaders、colheaders 导入其他类型的文件,3.6 数据I/O与文件操作,3.6.4 Internet数据操作 MATLAB中的网页操作: 导入网页内容:urlread 保存网页文件:urlwrite 文件的压缩与解压: 压缩文件:zip 解压文件:unzip 电子邮件传送与FTP访问: 电子邮件传送:sendmail FTP访问:f=ftp(host,username,password

26、),3.6 数据I/O与文件操作,3.6.5 低级文件I/O 文件操作: 打开文件:fid=fopen(fname.xxx,s) 关闭文件:fclose(fid) 获取文件状态:ferror 检测文件是否终止:feof 定位文件:fseek 读取文件数据:fread 数据写入文件:fwrite 数据格式化操作: 从文件中格式化读取数据:fscanf 将数据格式化写入文件:fprintf 将数据格式化写入字符串:sscanf 从字符串中格式化读取数据:sprintf,3.7 程序调试与性能优化,3.7.1 编程时产生的错误(bug) 语法(Syntax)错误: 变量名、函数名的误写,标点符号的缺

27、漏等 MATLAB通常能在P码编译或运行时立即发现,终止执行,并给出相应的错误原因以及所在行号 运行(Runtime)错误: 由算法本身引起,发生在运行过程中,较难处理 运行错误来源于算法模型与期望目标是否一致,程序模型是否与算法一致 涉及用户对期望目标原理的理解、对算法的理解 涉及用户对MATLAB指令的理解、对程序流的理解和对MATLAB工作机理的理解 运行错误的表现形态较多 运行错误是动态错误,3.7 程序调试与性能优化,3.7.2 直接调试法 将重点怀疑语句行、指令行后的分号“;”删除或改为“,”,使计算结果显示于屏幕 在适当的位置添加显示某些关键变量值的语句(包括使用disp在内) 利用echo指令,使运行时在屏幕上逐行显示文件内容 在原M脚本文件或函数文件中的适当位置增添keyboard

温馨提示

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

评论

0/150

提交评论