资源描述
第五章第五章脚本文件和函数文件脚本文件和函数文件第1页本节内容n 掌握脚本文件和函数文件区分n掌握函数文件编写和调用n掌握M文件调试方法n掌握文件打开和关闭第2页1 M文件-脚本文件 脚本文件只是一串按照用户意图排列而成脚本文件只是一串按照用户意图排列而成MATLAB指令集合,即只是简单命令叠指令集合,即只是简单命令叠加。它没有输入参数,也没有输出参数。加。它没有输入参数,也没有输出参数。它运行后产生变量都是全局变量,均驻它运行后产生变量都是全局变量,均驻留在留在workspace中。中。只要用户不使用指令只要用户不使用指令clear加以去除,或加以去除,或MATLAB指令窗不关闭,这些指令窗不关闭,这些变量将一直保留在基本工作空间中。变量将一直保留在基本工作空间中。第3页例例:计算小于任意自然数计算小于任意自然数nfibonnaci数。数。运行文件运行文件(F5/Debug|Run(F5/Debug|Run)第4页函数文件 函数文件是一个特殊类型运行在自己独立工作空间M文件,经过输入形参表接收数据,经过输出形参返回结果到调用文件。function function 输出形参表输出形参表=fname(=fname(输入形参表输入形参表)%H1%H1注释行注释行%其它注释行其它注释行 (可执行代码)(可执行代码)(return)(return)第5页以function开头一行为引导行,是函数定义语句,表示该M文件是一个函数文件。帮助文本首行(H1行):用于help帮助使用和lookfor搜索帮助文本:指H1行之后到函数体之前注释行。包含函数意义、各参数意义、调用格式以及程序作者、日期等。函数体是函数执行代码,是文件主要部分。注释:以%开头,可出现在程序中任意一行,用绿色表示。编译时会被忽略,不会影响程序运行速度。第6页例:编写函数计算两点之间距离。例:编写函数计算两点之间距离。第7页l当函数输出参数多于一个时,应该用当函数输出参数多于一个时,应该用方括号方括号括括起来,并以起来,并以逗号隔开逗号隔开;l传递给函数变量无须与函数定义行中参数同名;传递给函数变量无须与函数定义行中参数同名;l函数和文件命名规则与变量命名规则相同;函数和文件命名规则与变量命名规则相同;l若保留文件名与函数名不一样,则在若保留文件名与函数名不一样,则在调用时必调用时必须使用文件名须使用文件名。l提议:函数名与文件名应一致提议:函数名与文件名应一致(系统默认系统默认)注意事项第8页l函数文件运行时,函数文件运行时,MATLAB会专门为其开辟会专门为其开辟一一暂时工作空间暂时工作空间(函数空间),全部变量都(函数空间),全部变量都存放于此。文件运行完成后,该暂时空间以存放于此。文件运行完成后,该暂时空间以及全部中间变量就马上被去除;及全部中间变量就马上被去除;l函数空间随函数文件调用而产生,随调用而函数空间随函数文件调用而产生,随调用而结束;结束;l函数文件变量除尤其申明外均是局部变量函数文件变量除尤其申明外均是局部变量第9页函数运行-调用 注:1)函数调用时,先将实参传递给对应形参,实现参数传递,然后再执行函数功效。2)各实参出现次序、个数应与形参定义次序和个数一致,不然会犯错。函数文件运行不能选中菜单Run,而是调用。输出实参表输出实参表 函数名(输入实参表)函数名(输入实参表)n 函数调用普通格式第10页第11页脚本文件和函数文件区分n相同:扩展名都是.m,可用文件编辑器编写n不一样:1)脚本文件无输入、输出参数;2)函数文件与指令空间只能经过输入参数和输出参数通信,中间变量不出现;3)脚本文件产生变量都是全局变量,存放在基本工作空间中;而函数文件产生中间变量存放在暂时工作空间中,它随函数调用结束而删除;4)运行方式不一样。第12页1)以以ffib.m为名存盘为名存盘2)MATLAB命令窗口输入命令:命令窗口输入命令:ffib(1000)即可求小于即可求小于1000Fibonacci数。数。例例:编写函数求小于任意自然数编写函数求小于任意自然数nfibonnaci数。数。第13页递归调用:函数调用其本身function f=factor(n)if n提醒符),用户能够查看工作区中变量,也可改变变量值。当输入return指令时返回程序,继续运行。调试方法第34页n 程序暂停:采取pause函数能够暂停程序,直到用户按任一键程序才继续执行。若要强行中止程序运行,可用ctrl+c。n return:结束所在函数执行,把控制权转至主调函数或指令窗。不然,只有待整个被调函数执行完后,才会转出。n keyboard:将控制权交给键盘,用于程序调试及在程序运行中修改变量。第35页n调试一个单独函数时,可将函数改写为脚本文件,此时可直接对输入参数赋值,然后以脚本方式运行该M文件;n使用调试器使用调试器 能够准确地找到运行错误。经过设置断点可使程序运行到某行暂停,查看和修改工作空间中变量;也能够逐行运行程序,对执行流程进行完全监控。第36页调试器Debug 它可帮助用户正确地找到程序犯错位置,其常和端点breakpoint配合使用。即:经过设置断点使程序运行到某行暂停,此即:经过设置断点使程序运行到某行暂停,此即:经过设置断点使程序运行到某行暂停,此即:经过设置断点使程序运行到某行暂停,此时可经过观察程序变量、表示式、调试输出信时可经过观察程序变量、表示式、调试输出信时可经过观察程序变量、表示式、调试输出信时可经过观察程序变量、表示式、调试输出信息等来了解程序运行情况;也能够逐行运行程息等来了解程序运行情况;也能够逐行运行程息等来了解程序运行情况;也能够逐行运行程息等来了解程序运行情况;也能够逐行运行程序,对执行流程进行完全监控。序,对执行流程进行完全监控。序,对执行流程进行完全监控。序,对执行流程进行完全监控。n 调试伎俩有:设置断点、跟踪和观察变量第37页DebugDebug菜单项菜单项lStepStep(F10F10):单步执行语句,对于函):单步执行语句,对于函数调用可将此函数一次执行完成数调用可将此函数一次执行完成lStep InStep In(F11F11):单步执行语句,碰到):单步执行语句,碰到函数时则进入函数体内单步执行函数时则进入函数体内单步执行lStep OutStep Out(shift+F11shift+F11):从函数体内):从函数体内运行到函数体外,即从当前位置运行到运行到函数体外,即从当前位置运行到调用函数语句下一条语句调用函数语句下一条语句第38页lRunRun(F5F5):从头开始执行程序,直到碰到一):从头开始执行程序,直到碰到一个端点或程序结束;个端点或程序结束;lRun to CursorRun to Cursor:从当前位置运行到光标处;:从当前位置运行到光标处;lExit Debug ModeExit Debug Mode:退出调试工具,同时结束:退出调试工具,同时结束调试过程和程序运行过程调试过程和程序运行过程。lSet/Clear BreakpointsSet/Clear Breakpoints(F12F12):设置或去除):设置或去除光标所在行断点光标所在行断点lClear all BreakpointsClear all Breakpoints:去除全部断点:去除全部断点第39页调试方法步骤n 设置断点:选中要设置语句,用快捷键F12或用工具条上大红点或点击菜单set breakpoint注:断点设置后,在窗口左边框上大红圆点注:断点设置后,在窗口左边框上大红圆点表示,非常醒目。表示,非常醒目。n设置断点后,点击菜单Debug|Run,程序便处在调试状态。而后程序会自动在断点处暂停,此时左边框上对应位置会出现一个绿色箭头指示被中止语句。第40页n单步执行各语句:此时可查看各变量内容,以判断程序流程是否正确。查看变量内容:能够点击工作空间变量,或查看变量内容:能够点击工作空间变量,或查看变量内容:能够点击工作空间变量,或查看变量内容:能够点击工作空间变量,或者用鼠标指向变量名,变量值将自动显示。者用鼠标指向变量名,变量值将自动显示。者用鼠标指向变量名,变量值将自动显示。者用鼠标指向变量名,变量值将自动显示。n退出调试工具:选中菜单exit debug moden去除断点:与设置方法相同。第41页因因collatz.m程序需要输入程序需要输入参数参数n,故查看输出结果不,故查看输出结果不能用能用Run命令,而需在指命令,而需在指令窗中输入令窗中输入collatz(5)第42页6.5 程序优化n 防止使用循环(向量化编程)要尽可能地使用向量或矩阵编程,而不是像在其它语言中对向量或矩阵元素编程。这么,不但能够使程序较短,而且能大大提升运行速度。要求:编程者须熟悉数组运算和要求:编程者须熟悉数组运算和MATLABMATLAB指令指令n 数组预定义 数组空间预配置可提升运行速度(对高阶矩阵影响尤为显著)以及内存利用率,不然数组屡次扩维会增加内存碎片。第43页 clear vr=0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41;ir=0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345;L=length(vr)%计算数组长度计算数组长度 for k=1:L r(k)=vr(k)/ir(k);%依据各测量点计算电阻依据各测量点计算电阻 end sr=0;for k=1:L sr=sr+r(k);%计算全部电阻之和计算全部电阻之和 end rm=sr/L 计算电阻平均值计算电阻平均值例:依据测得一组电压、电流值计算平均电阻值。例:依据测得一组电压、电流值计算平均电阻值。1.1.非向量化编程非向量化编程第44页 clear vr=0.89,1.20,3.09,4.27,3.62,7.71,8.99,7.92,9.70,10.41;ir=0.028,0.040,0.100,0.145,0.118,0.258,0.299,0.257,0.308,0.345;r=vr./ir%r=vr./ir%计算各测量点上电阻值计算各测量点上电阻值 rm=mean(r)rm=mean(r)计算电阻平均值计算电阻平均值2.2.向量化编程向量化编程第45页本节要求1.掌握脚本文件和函数文件区分2.掌握函数文件定义和运行3.熟练使用debug调试器4.掌握文件打开、关闭和读写操作5.逐步含有向量化编程思想第46页
展开阅读全文