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

下载本文档

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

文档简介

第三章MATLAB程序设计 一 matlab的工作模式 1 指令驱动模式 通常matlab以指令驱动模式工作即在matlab窗口下 当用户输入单行指令时 matlab立即处理这条指令 并显示结果 这就是matlab命令行方式 命令行操作时 matlab窗口只允许一次执行一行上的一个或几个语句 x1 0 10 x2 0 3 11 x3 11 5 3 0 x1 012345678910 x2 0369x3 11 50008 50005 50002 5000在matlab窗口输入数据和命令进行计算时 当处理复杂问题和大量数据时是不方便的 因此应编辑m文件 2 m文件m文件的语法类似于c语言 但有自身特点 它只是一个简单的ASCII码文本文件 执行程序时逐行解释运行程序 matlab是解释性的编程语言 m文件有两类 独立的m文件 称程序文件 可调用m文件 称函数文件 1 程序文件 简单的m文件程序文件实际上是一串指令的集合 与在命令窗口逐行执行文件中的所有指令 其结果是一样的 没有输入输出参数 2 matlab内置函数文件matlab自定义的函数文件称内置函数文件调用内置函数的方法 使用函数名并给出相应的入口 出口参数即可 例如 sin m函数 用typesin查不到 调用格式 y sin 2 x 实际应用中 x 0 2 pi 180 2 pi y sin 2 x plot x y 3 函数m文件 需要输入变量 返回输出变量matlab用户可以根据需要编辑自己的m文件 它们可以像库函数一样方便的调用 从而极大地扩展了matlab的能力 各种工具箱的内部函数基本都是M函数文件 用户也可以自己编写一组M函数文件组成工具箱对于某一类特殊问题 如创建了许多m函数文件 则可形成新的工具箱 这种用matlab语言创建定义新的matlab函数的功能 正体现了matlab语言强大的扩展功能 二 文本编辑窗MATLAB文本编辑器的功能就是完成编写 修改和调试这种文件程序就要用到M文件编辑器 调试器 文本编辑器 调试器的启动可以从命令窗口中或当前目录窗口中选择新建或打开文件按钮进入 或在命令窗口中键入 edit 回车 其编辑模式如下图所示 在文本编辑器中 文字的不同颜色显示表明文字的不同属性 绿色 注解 黑色 程序主体 红色 属性值的设定 蓝色 控制流程 编辑功能与大多数编辑器类似 都有复制 粘贴 查找 加注释 缩进等功能具有程序调试功能 设置断点 单步执行 连续执行等在运行程序之前 必须设置好MATLAB的工作路径 使得所要运行的程序及运行程序所需要的其他文件处在当前目录之下 只有这样 才可以使程序得以正常运行 否则可能导致无法读取某些系统文件或数据 从而程序无法执行 文本编辑器的相关菜单功能 SaveandRun 保存并运行程序 直到遇到下一个断点 对应工具按钮为 SingleStep 单步执行 对应工具按钮为 StepIn 运行当前程序行 如果当前行调用了另外一个函数 则跳转到这个函数里 对应的工具按钮为 ExitDebugMode 退出调试模式 工具按钮为 Set ClearBreakpoint 设置 清除断点 ClearAllBreakpoints 清除所有的断点 文本编辑器的参数设置 三 MATLBA程序的基本设计原则 1 后面的内容是程序的注解 要善于运用注解使程序更具可读性 2 养成在主程序开头用clear指令清除变量的习惯 以消除工作空间中其他变量对程序运行的影响 但注意在子程序中不要用clear 3 参数值要集中放在程序的开始部分 以便维护 要充分利用MATLAB工具箱提供的指令来执行所要进行的运算 在语句行之后输入分号使其及中间结果不在屏幕上显示 以提高执行速度 4 input指令可以用来输入一些临时的数据 而对于大量参数 则通过建立一个存储参数的子程序 在主程序中用子程序的名称来调用 5 程序尽量模块化 也就是采用主程序调用子程序的方法 将所有子程序合并在一起来执行全部的操作 6 充分利用Debugger来进行程序的调试 设置断点 单步执行 连续执行 并利用其他工具箱或图形用户界面 GUI 的设计技巧 将设计结果集成到一起 7 设置好MATLAB的工作路径 以便程序运行 8 MATLAB程序的基本组成结构 说明清除命令 清除workspace中的变量和图形 clear close 定义变量 包括全局变量的声明及参数值的设定逐行执行命令 指MATLAB提供的运算指令或工具箱 提供的专用命令控制循环 包含for ifthen switch while等语句逐行执行命令 绘图命令 将运算结果绘制出来 M程序文件以 m格式进行存取 包含一连串的MATLAB指令和必要的注释 M程序文件中的命令格式和前后位置 与在命令窗口中输入的没有任何区别 需要在工作空间中创建并获取变量 也就是说处理的数据为命令窗口中的数据 没有输入参数 也不会返回参数 程序运行时只需在工作空间中键入其名称即可 使用helpxxx时将返回程序开始处的注释信息 四 M程序文件 命令文件包括两部分 注释文件和程序文件 二阶系统时域响应曲线 阻尼系数为0 3x 0 0 1 20 y 1 1 sqrt 1 0 3 2 exp 0 3 x sin sqrt 1 0 3 2 x acos 0 3 plot x y 程序部分 画出分段函数所表示的曲面 Thisisaexample a 2 b 2 clf CLFClearcurrentfigurex a 0 2 a y b 0 2 b fori 1 length y forj 1 length x ifx j y i 1z i j 0 5457 exp 0 75 y i 2 3 75 x j 2 1 5 x j elseifx j y i 1z i j 0 5457 exp 0 75 y i 2 3 75 x j 2 1 5 x j elsez i j 0 7575 exp y i 2 6 x j 2 endendendaxis a a b b min min z max max z colormap flipud winter surf x y z 五 M函数文件 第一行 函数声明行 functiony dfw1 r p res r 1 p0 p 1 y sum res 输出参数 函数名 输入参数 可以没有输入参数 函数名要遵守Matlab变量名的命名规则 M函数存盘时的文件名与函数名相同 从函数返回的惟一信息包含在输出参数中 要确保函数中包含一条给输出参数赋值的语句 可以没有输出参数 function输出形参列表 函数名 输入形参列表 注释说明部分 可选 函数体语句 必须 第一行为引导行 表示该M文件是函数文件函数名的命名规则与变量名相同 必须以字母开头 当输出行参多于一个时 用方括号括起来函数必须是一个单独的M文件函数文件名必须与函数名一致以百分号开始的语句为注释语句 函数文件由function语句引导 函数可以接受输入变量 并将运算结果送到输出变量函数具有单独的工作空间 函数体内使用的除返回和输入变量外的所有变量都是局部变量 只在函数工作空间中存在 局部变量不保存在Matlab工作空间中 只在函数运行期间有效当函数执行到最后一条命令或遇到return命令后 就结束函数的执行 同时函数工作空间的变量被清除 函数基本格式 1 函数定义行 关键字function function out1 out2 filename in1 in2 输入和输出 返回 的参数个数分别由nargin和nargout两个MATLAB保留的变量来给出 2 第一行帮助行 即H1行以 开头 作为lookfor指令搜索的行 3 函数体说明及有关注释以 开头 用以说明函数的作用及有关内容 作为help指令显示的行 如果不希望显示某段信息 可在它的前面加空行 4 函数体语句 functiony tt zeta tt 二阶系统时域响应曲线 其他注释 zeta阻尼系数x 0 0 1 20 y 1 1 sqrt 1 zeta 2 exp zeta x sin sqrt 1 zeta 2 x acos zeta plot x y 用于lookfor x y是局部变量 help 在MATLAB中 调用函数的常用形式是 输出参数1 输出参数2 函数名 输入参数1 输入参数2 函数调用可以嵌套 一个函数可以调用别的函数 甚至调用它自己 递归调用 1 函数调用 a 1 b 3 c 1 x1x2 FindRoots a b c function x1x2 FindRoots a b c a x 2 b x c 0 x1 b b 2 4 a c 0 5 2 a x2 b b 2 4 a c 0 5 2 a 函数调用的一般格式 输出实参列表 函数名 输入实参列表 函数调用时 实参的顺序应与函数定义时的形参的顺序一致 函数调用 functiony dfw1 r p 函数定义 形参 z dfw1 x k 实参 1 nargin函数体内获取实际输入变量的个数2 nargout函数体内获取实际输出变量的个数3 nargin fun 函数体外获取定义输入变量数4 nargout fun 函数体外获取实际输出变量数5 varargin获得输入变量的各元素内容6 varargout获得输出变量的各元素内容见文件mysum m MATLAB在函数调用上有一个与众不同之处 函数所传递的参数具有可调性 函数文件examp m functionfout examp a b c ifnargin 1fout a elseifnargin 2fout a b elseifnargin 3fout a b c 2 end 程序文件mydemo m x 1 3 y 1 2 3 examp x examp x y examp x y 3 函数通过输入和输出参数与其它M文件进行数据传递 当函数调用完毕后 该函数文件中定义的所有局部变量都将被释放 即全部被清除 函数文件中的变量都是局部的 即一个函数文件中定义的变量不能被另一个函数文件或其它M文件使用 2 局部变量 函数文件运行时 matlab会专门开辟一个临时工作区间 称为函数工作区间 如果在M函数中 调用某个M程序文件 那么该程序文件运行时产生的所有变量都存放于该函数空间中 而不是存放在Matlab空间 变量名列表中的各个变量用空格隔开 不能用逗号 全局变量给函数间的数据传递带来了方便 但却破坏了函数对变量的封装 降低了程序的可读性 因而在结构化程序设计中 全局变量是不受欢迎的 特别是当程序较大 子程序较多时 全局变量将个程序调试和维护带来不便 故不提倡使用全局变量 global变量名列表 3 全局变量 如果在若干个M文件中 都把某个变量定义为全局变量 则这些函数将公共使用这一变量 所有函数都可以对它进行存取和修改操作 globalabca 18 3036b 3816 44c 46 13fori 1 11t 373 2 10 i 1 psat i antoine t end 函數 Antoine mfunctionp vap antoine t globalabcp vap exp a b t c function num1 num2 num3 test3 varargin globalfirstlevelsecondlevelnum1 0 num2 0 num3 0 list zeros nargin fori 1 narginlist i sum varargin i list i list i length varargin i iflist i firstlevelnum1 num1 1 elseiflist i secondlevelnum2 num2 1 elsenum3 num3 1 endend globalfirstlevelsecondlevel firstlevel 85 secondlevel 75 a b c test3 90 89 60 79 89 60 99 98 100 a 1b 2c 0 4 子函数 函数文件中可以含有一个或多个子函数子函数由function语句引导主函数必须位于最前面 子函数出现的次序任意子函数只能被主函数和位于同一个函数文件中的其它子函数调用除了用global定义的全局变量外 子函数中的变量都是局部变量 子函数与主函数及其它子函数之间通过输入 输出参数进行数据传递主函数与子函数的工作空间相互独立用help和lookfor命令不能提供子函数的帮助信息 functiontest 注释tt 0 3 holdon tt 0 5 tt 0 707 functiony tt zeta 二阶系统时域响应曲线 zeta阻尼系数x 0 0 1 20 y 1 1 sqrt 1 zeta 2 exp zeta x sin sqrt 1 zeta 2 x acos zeta plot x y function avg med main fun x 主函数n length x avg sub fun1 x n med sub fun2 x n functiona sub fun1 x n 子函数a sum x n functionm sub fun2 x n 子函数x sort x ifrem n 2 1m x n 1 2 elsem x n 2 x n 2 1 2 end MATLAB的搜索过程 matlab在一个文件中碰到指令cow时 1 检查cow是否变量 2 检查cow是否内建函数 3 检查cow是否子函数 4 检查cow是否私用函数 私用函数指位于private目录上的M文件函数 私用函数只能被private目录的直接父目录上的M函数文件所调用 5 检查cow是否当前目录上的文件 先找 p 再找 m 6 检查搜索路径上是否有cow 六 程序流程结构 一 M 文件中输入 输出命令 直接赋值输入 提示对话输入 input命令 x 2 x input 请输入参数x a 1 2 3 4 a input 请输入矩阵a s anystring s input Pleaseinputs s 直接输出 格式控制输出 fprintf命令 xfprintf x 0f y 5f n pi pi disp a b fprintf x 5g y 10 5g n N pi 例 输入一个人的姓名 xm input What syourname s 例 求一元二次方程a2 bx c 0的根 a input a b input b c input c d b b 4 a c x b sqrt d 2 a b sqrt d 2 a 将该程序以aa m文件存盘 然后运行aa m文件 keyboard 停止程序执行 把控制权交给键盘 输入return并回车后继续程序执行 return 结束函数执行 返回主程序 若想强行终止程序或中断死循环 按下Ctrl C键 pause函数 暂停程序的执行 调用格式 pause 延迟秒数 注 如果省略延迟时间 直接使用pause 则将暂停程序 直到用户按任一键后程序继续执行 二 选择结构 选择结构的语句有if语句和switch语句 1 if语句格式一 if条件语句组end 格式二 if条件语句组1else语句组2end 格式三 if条件1语句组1elseif条件2语句组2 elseif条件m语句组melse语句组m 1end 例输入三角形的三条边 求面积 A input 请输入三角形的三条边 ifA 1 A 2 A 3 elsedisp 不能构成一个三角形 end运行 请输入三角形的三条边 456 9 9216 输入一个字符 若为大写字母 则输出其后继字符 若为小写字母 则输出其前导字符 若为其他字符则原样输出 c input s ifc A end 建立符号函数sign x x input x ifx 0sn 1 elseifx 0sn 0 elsesn 1 endfprintf x 5f sn 0f n x sn 2switch语句 switch语句根据变量或表达式的取值不同 分别执行不同的语句 其格式为 switch表达式case值1语句组1case值2 语句组2 case值m语句组motherwise语句组m 1end 例根据变量num的值来决定显示的内容 num input 请输入一个数 switchnumcase 1disp Iamateacher case0disp Iamastudent case1disp Youareateacher otherwisedisp Youareastudent end 三 循环结构 实现循环结构的语句 for语句和while语句 1 for语句 格式 for循环变量 表达式1 表达式2 表达式3循环体语句end注 其中表达式1的值为循环变量的初值 表达式2的值为步长 表达式3的值为循环变量的终值 步长为1时 表达式2可以省略 求1 n 100的和y 0 fori 1 100f 1 2 i 1 y y f end 求奇数和 s 1 3 5 2k 1 n input 请输入n s 0 fori 1 2 ns s i fprintf i 0f s 0f n i s end 2 while语句格式为 while 条件表达式 循环体语句end循环控制语句 breakcontinuewhile循环和for循环的区别在于 while循环结构的循环体被执行的次数不是确定的 而for结构中循环体的执行次数是确定的 求e e 1 1 1 2 1 3 1 n 1 0e 8p p i r 1 p e e r fprintf i 0f r 9f e 9f n i r e i i 1 end 求 1 y3break endi i 1 endn i 1y y f break终止最内层的for或while语句 执行end后面的语句 通常与if结构结合使用continue结束本次for或while循环 继续进行下次循环 通常与if结构结合使用 break语句和continue语句举例求 100 200 之间第一个能被21整除的整数 forn 100 200ifrem n 21 0continueendbreakendn 3 循环的嵌套 如果一个循环结构的循环体又包括一个循环结构 就称为循环的嵌套 或称为多重循环结构 多重循环的嵌套层数可以是任意的 可以按照嵌套层数 分别叫做二重循环 三重循环等 处于内部的循环叫作内循环 处于外部的循环叫作外循环 求 100 1000 以内的全部素数 n 0 form 100 1000flag 1 j m 1 i 2 whilei jend i i 1 endifflagn n 1 prime n m endendprime 变量prime存放素数 函数可以嵌套调用 即一个函数可以被其它函数调用 甚至可以被它自身调用 此时称为递归调用 必须确保有一个终止条件来结束递归过程 七 递归函数 函数文件factor mfunctionf factor n if n 1 f 1 elsef n factor n 1 end main m 计算s 1 2 3 4 5 s 0 fori 1 5s s factor i endfprintf s g n s 例 利用函数的递归调用计算n 例 数字全排列问题 全排列是将一组数按一定顺序进行排列 如果这组数有n个 那么全排列数为n 个 如N 3时 共有以下6种排列方式 123 132 213 231 312 321 1 回溯法 使用递归实现 每个数的取法都有N个方向 1 2 N 当取够N个数时 输出一个排列 然后退后一步 取前一个数的下一个方向 即前一个数 1 并且要保证所有数字不能重复 当前数字的所有方向都取完时 继续退一步 一直重复到第一个数为止 functionqpl huisu list k ifk length list disp list elsefornum 1 length list ifall list num list k num qpl huisu list k 1 endendend clc clearall list zeros size 1 4 qpl huisu list 1 2 递归算法 以 1 2 3 4 5 为例说明 1 一个数的全排列就是其本身 2 首先看最后两个数4 5 它们的全排列为45和54 即以4开头的5的全排列和以5开头的4的全排列 3 再看后三个数3 4 5 它们的全排列为 345 354 435 453 534 543即以3开头的和 4 5 的全排列的组合 以4开头的和 3 5 的全排列的组合和以5开头的和 3 4 的全排列的组合 为了更容易理解 将数组中的所有的数分别与第一个数交换 这样就总是在处理后n 1个数的全排列 可以推断 设一组数 全排列为 1 2345 2 1345 3 2145 4 2315 5 2341 12 345 13 245 14 325 15 342 123 45 124 35 125 34 1234 5 1235 4 r 1 r 3 r 2 r 5 r 4 k 1 5 k 3 5 k 2 5 k 4 5 12345 12354 functionqpl list r ifr length list disp list elsefork r length list list r k list k r qpl list r 1 list r k list k r endend clc clearall list 1 4qpl list 1 八 Matlab计时函数介绍 1 calendar 返回当前日历2 calendar year month 反回指定的年月日历 3 calendar data 返回公元0000年算起的天数的日历 4 cputime 以秒返回cpu当前时间 5 tic toc启用 关闭计时器 6 clock yearmonthdayhourminuteseconds 作用 计算运行程序所用的时间 tic 你的Matlab程序 time toc Matlab程序的运行时间 t0 clock 你的Matlab程序 time etime clock t0 Matlab程序的运行时间 t0 cputime 你的Matlab程序 time cputime t0 Matlab程序的运行时间 Matlab计时函数的调用 九 程序设计优化 以矩阵为操作主体以向量运算代替循环运算 提倡矩阵操作tic x 1 fori 1 1000 y i sin x x x 0 1 pi end tocelapsed time 0 0500tic x 1 0 1 pi 1000 pi y sin x tocelapsed time 0 0100 在多重循环的情况下 建议外循环执行循环次数少的 内循环执行循环次数多的 例 生成5 10000的Hilbert矩阵 其中hi j 1 i j 1 Test2 mticforj 1 10000fori 1 5H i j 1 i j 1 endendtoc Test1 mticfori 1 5forj 1 10000H i j 1 i j 1 endendtoc test1elapsed time 0 2970 test2elapsed time 0 6100 大型矩阵预先定维大型矩阵动态的定维会降低程序运行效率 所以 应预先估计变量的最大维数 用zeros或ones等进行预先定维 tic H zeros 5 10000 fori 1 5forj 1 10000H i j 1 i j 1 endendtoc tic H zeros 5 10000 fori 1 5H i 1 i i 9999 endtoc test1elapsed time 0 2970 test2elapsed time 0 0310 优先考虑内在函数采用有效算法提高内存使用效率主要的命令 clear 清除变量 pack 将变量存在磁盘再载入 quit 退出Matlab环境 save 将变量数据存入文件 load 将文件数据加载进入工作空间 十 数据类型 1 数值型double64 bit双精度single32 bit单精度int3232 bitsignedint1616 bitsignedint88 bitsigneduint3232 bitunsigneduint1616 bitunsigneduint88 bitunsignedformatlong改变小数点后显示位数 字符串用单引号输入或赋值 字符串作为字符数组存储 每个字符占两个字节字符串的每个字符都是都是字符数组的一个元素 s symbolic s symbolic size s ans 18 s 3 ans m 2 字符串型 字符串的转换double字符串转换为数值代码char将ASCII转化为字符串num2str数字转换为字符串int2str整数转换为字符串mat2str矩阵转换为字符串str2num转换字符串为数字str2double将字符串矩阵转换成双精度数sprintf将数据格式化成字符串str2mat 将多个字符串组合为矩阵 doub

温馨提示

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

评论

0/150

提交评论