matlab ppt编程,第4章_MATLAB程序设计.ppt

4 1M文件 4 1 1M文件的分类M文件 用MATLAB语言编写的程序 扩展名为 mM文件可以根据调用方式的不同分为两类 命令文件 ScriptFile也称脚本文件 函数文件 FunctionFile 二者的区别 1 命令文件没有输入参数 也不返回输出参数 2 命令文件中命令执行结果返回到工作空间中 函数文件中定义的变量为局部变量 3 命令文件可以直接运行 函数文件要以调用的方式来执行 例4 1 建立一个M文件将两个变量的值互换 程序1 建立命令文件并以文件名exch m存盘 clear 清除工作空间a 1 10 b 11 12 13 14 15 16 17 18 c a a b b c ab在命令窗口中输入exch 将会执行该命令文件 a 1112131415161718b 12345678910 程序2 建立函数文件fexch m并保存 function a b fexch a b c a a b b c 在命令窗口调用该函数文件 clear x 1 10 y 11 12 13 14 15 16 17 18 x y fexch x y 调用后查看工作空间 4 1 2M文件的建立与打开 M文件是一个文本文件 它可以用任何文本编辑程序来建立和编辑 而一般常用且最为方便的是使用MATLAB提供的文本编辑器 1 建立新的M文件为建立新的M文件 启动MATLAB文本编辑器有3种方法 1 菜单操作 2 命令操作 在命令窗口输入命令edit 3 按钮操作 单击工具栏上的NewM File命令按钮 2 打开已有的M文件也有3种方法 1 菜单操作 2 命令操作 在命令窗口输入命令editfilename m 3 按钮操作 单击工具栏上的OpenFile命令按钮 4 2程序控制结构 程序结构一般分为3种 顺序结构 选择结构 循环结构 4 2 1顺序结构 就是依次顺序执行程序中各条命令 1 从键盘输入数据 可以使用input函数 调用格式为 A input 提示信息 选项 其中提示信息为一个字符串 用于提示用户输入什么样的数据 采用 s 选项 则将输入的字符串赋值给变量A 例如 想输入一个人的姓名 可采用命令 xm input What syourname s 2 数据的输出命令窗口输出函数主要有disp函数 其调用格式为disp 输出项 其中输出项既可以为字符串 也可以为矩阵 例4 2求一元二次方程ax2 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 disp x1 num2str x 1 x2 num2str x 2 练习1 建立该m文件 并运行 3 程序的暂停暂停程序的执行可以使用pause函数 其调用格式为 pause 延迟秒数 如果省略延迟时间 直接使用pause 则将暂停程序 直到用户按任一键后程序继续执行 若要强行中止程序的运行可使用Ctrl C命令 4 2 2选择结构 1 if语句在MATLAB中 if语句有3种格式 1 单分支if语句 if条件语句组end当条件成立时 则执行语句组 执行完之后继续执行if语句的后继语句 若条件不成立 则直接执行if语句的后继语句 2 双分支if语句 if条件语句组1else语句组2end当条件成立时 执行语句组1 否则执行语句组2 语句组1或语句组2执行后 再执行if语句的后继语句 x input 请输入x的值 ifx 10y cos x 1 sqrt x x 1 elsey x sqrt x sqrt x endy 例4 3计算分段函数 运行 计算x分别为 9 10 11时y的值 3 多分支if语句 if条件1语句组1elseif条件2语句组2 elseif条件m语句组melse语句组nend 例4 4 输入一个字符 若为大写字母 则输出其对应的小写字母 若为小写字母 则输出其对应的大写字母 若为数字字符则输出其对应的数值 若为其他字符则原样输出 c input 请输入一个字符 s ifc A end 求分段函数的值 用if语句实现 分别输出x 5 0 3 0 1 0 2 0 2 5 3 0 5 0时的y值 练习2 练习2 求分段函数的值 用if语句实现 分别输出x 5 0 3 0 1 0 2 0 2 5 3 0 5 0时的y值 讨论 若把程序中input命令改为 x 5 0 3 0 1 0 2 0 2 5 3 0 5 0 即处理的数据不是标量而是向量 运行结果会怎样 为什么 应如何修改程序 141121 0 2559 2 switch语句 switch语句根据表达式的取值不同 分别执行不同的语句 其语句格式为 switch表达式case表达式1语句组1case表达式2语句组2 case表达式m语句组motherwise语句组nend 当表达式的值等于表达式1的值时 执行语句组1 当表达式的值等于表达式2的值时 执行语句组2 当表达式的值不等于case所列的表达式的值时 执行语句组n 当任意一个分支的语句执行完后 直接执行switch语句的下一句 表达式可以是标量或字符串 case表达式还可以是单元矩阵 switchyearcase0 5rate 2 100 case1rate 2 8 100 case3rate 3 2 100 case5rate 3 8 100 end 例4 5 某商场对顾客所购买的商品实行打折销售 标准如下 商品价格用price来表示 price 200没有折扣200 price 5003 折扣500 price 10005 折扣1000 price 25008 折扣2500 price 500010 折扣5000 price14 折扣输入所售商品的价格 求其实际销售价格 price input 请输入商品价格 switchfix price 100 case 0 1 价格小于200rate 0 case 2 3 4 价格大于等于200但小于500rate 3 100 casenum2cell 5 9 价格大于等于500但小于1000rate 5 100 casenum2cell 10 24 价格大于等于1000但小于2500rate 8 100 casenum2cell 25 49 价格大于等于2500但小于5000rate 10 100 otherwise 价格大于等于5000rate 14 100 endprice price 1 rate 输出商品实际销售价格 switch表达式值如果等于case的单元矩阵中的某个元素 则满足条件 num2cell 5 9 数值矩阵 5 9 转化为单元矩阵 5 6 7 8 9 3 try语句语句格式为 try语句组1catch语句组2endtry语句先试探性执行语句组1 如果语句组1在执行过程中出现错误 则将错误信息赋给保留的lasterr变量 并转去执行语句组2 例4 6 矩阵乘法运算要求两矩阵的维数相容 否则会出错 先求两矩阵的乘积 若出错 则自动转去求两矩阵的点乘 程序如下 A 1 2 3 4 5 6 B 7 8 9 10 11 12 tryC A B catchC A B endClasterr 显示出错原因 4 2 3循环结构 1 for语句for语句的格式为 for循环变量 from step to循环体语句end 例4 7 一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数 153 输出全部水仙花数 程序如下 sxh form 100 1 999m1 fix m 100 求m的百位数字m2 rem fix m 10 10 求m的十位数字m3 rem m 10 求m的个位数字ifm m1 3 m2 3 m3 3sxh sxh m m添加到sxh矩阵中 也可disp m 直接显示endendsxh 例4 8 当n 100时 求y的值 y 0 n 100 fork 1 ny y 1 k k endy 为提高运行速度 用向量运算代替循环操作 n 1 100 k 1 n n y sum k tic n 1 100 k 1 n n y sum k time2 toc result1 strcat 采用循环语句运算消耗的时间为 num2str time1 秒 result2 strcat 采用向量运算消耗的时间为 num2str time2 秒 disp result1 disp result2 测试循环和向量运算各自的时间 进行比较 结果 采用循环语句运算消耗的时间为 0 00065396秒采用向量运算消耗的时间为 0 00009 4465秒 tic 计时开始y 0 n 100 fork 1 ny y 1 k k endytime1 toc 计时结束 根据求 的近似值 当n分别取100 1000 10000时 结果是多少 要求 分别用循环结构和向量运算 使用sum函数 来实现 练习3 例4 9求定积分 该定积分的几何意义为 曲线y f x 与x 0 x 3 pi所围的曲边梯形的面积 将其n等分 每个小曲边梯形的面积用梯形代替 将其累加起来得积分的近似值 程序如下 a 0 b 3 pi n 1000 h b a n x a s 0 f0 exp 0 5 x sin x pi 6 fork 1 nx x h f1 exp 0 5 x sin x pi 6 s s f0 f1 h 2 f0 f1 ends 向量运算一 a 0 b 3 pi n 1000 h b a n x a h b x为向量f exp 0 5 x sin x pi 6 fork 1 ns k f k f k 1 h 2 ends sum s 向量运算二 a 0 b 3 pi n 1000 h b a n x a h b f exp 0 5 x sin x pi 6 ds f 1 n f 2 n 1 h 2 s sum ds for语句更一般的格式为 for循环变量 矩阵表达式循环体语句end执行过程是依次将矩阵的各列元素赋给循环变量 然后执行循环体语句 直至各列元素处理完毕 例4 10 写出下列程序的执行结果 s 0 a 12 13 14 15 16 17 18 19 20 21 22 23 fork as s k enddisp s 39485766 等价于s a 1 a 2 a 3 2 while语句 while语句的一般格式为 while 条件 循环体语句end若条件成立 则执行循环体语句 执行后再判断条件是否成立 如果不成立则跳出循环 例4 11 从键盘输入若干个数 当输入0时结束输入 求这些数的平均值和它们之和 程序如下 sum 0 n 0 val input Enteranumber endin0 while val 0 sum sum val n n 1 val input Enteranumber endin0 endif n 0 summean sum nend 例4 12根据矩阵指数的幂级数展开式求矩阵指数 程序如下 X为矩阵X input EnterX E zeros size X F eye size X 以矩阵形式表示1 即单位矩阵n 1 whilenorm F 1 0E E F F F X n n n 1 endEexpm X 超函数 参数为矩阵 根据求 1 y 3时的最大n值 2 与 1 的n值对应的y值 练习4 3 break语句和continue语句break 用于终止循环的执行 当在循环体内执行到该语句时 程序将跳出循环 继续执行循环语句的下一语句 continue 控制跳过循环体中的某些语句 当在循环体内执行到该语句时 程序将跳过循环体中所有剩下的语句 继续下一次循环 例4 13 求 100 200 之间第一个能被21整除的整数 程序如下 forn 100 200ifrem n 21 0continueendbreakendn 4 循环的嵌套 一个循环结构的循环体又包括一个循环结构 就称为循环的嵌套 或称为多重循环结构 例4 14若一个数等于它的各个真因子之和 则称该数为完数 如6 1 2 3 所以6是完数 求 1 500 之间的全部完数 form 1 500s 0 fork 1 m 2ifrem m k 0s s k endendifm sdisp m endend 例4 15 用筛选法求某自然数m范围内的全部素数 k从2 sqrt m 筛去k的倍数 不包括k m input m 假设m为20p 1 m p 1 0 筛去1fork 2 sqrt m forn 2 k k mp n 0 筛去k的倍数 可能会重复筛某些数 如6endendn find p 0 p n 筛去2的倍数 3的倍数 4的倍数 m input m p 2 m fork 2 sqrt m n find rem p k 0 删除n指定位置的元素endp 更简洁的程序 m 20 K 2时p 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 rem p k 0为 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 p k为 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 运算结果为 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 排除了k本身p 2 3 5 7 9 11 13 15 17 19 思考 如果fork 2 sqrt m 改为 fork p结果是否正确 循环体中p在改变 是否会影响到k的取值 分析下面过程运行结果 p 1 2 3 4 5 6 c 0 fork pc c 1 p 7 k pkendc循环次数c结果是多少 不会 m input m p 2 m fork 2 sqrt m fork pn find rem p k 0 删除n指定位置的元素endp 已知求f1 f100中 1 最大值 最小值 各数之和 2 正数 零 负数的个数 练习5 4 3函数文件 4 3 1函数文件的基本结构函数文件由function语句引导 其基本结构为 function输出形参表 函数名 输入形参表 注释说明部分函数体语句以function开头的一行为引导行 表示该M文件是一个函数文件 函数名的命名规则与变量名相同 文件名与函数名最好一致 当输出形参多于一个时 则应该用方括号括起来 例4 16 编写函数文件求半径为r的圆的面积和周长 函数文件如下 function s p fcircle r CIRCLEcalculatetheareaandperimeterofacircleofradiir r圆半径 s圆面积 p圆周长 2013年9月13日编s pi r r p 2 pi r 将以上函数文件以文件名 fcircle m保存 然后在命令窗口调用该函数 s p fcircle 10 注释说明包括3部分 1 第一行注释 大写的函数名和函数功能简要描述 2 第一注释行之后的注释行 参数含义及调用格式 构成在线帮助文本 3 与在线帮助文本空一行的注释行 作者 修改日期 版本等信息 用于软件档案管理 4 3 2函数调用 函数调用的一般格式是 输出实参表 函数名 输入实参表 要注意的是 函数调用时各实参出现的顺序 个数 应与函数定义时形参的顺序 个数一致 否则会出错 函数调用时 先将实参传递给相应的形参 从而实现参数传递 然后再执行函数的功能 定义一个函数文件 求给定复数的指数 对数 正弦和余弦 并在命令文件中调用该函数文件 练习6 一个自然数是素数 且它的数字位置经过任意对换后仍为素数 称之为 绝对素数 例如13是绝对素数 试求所有两位绝对素数 提示 定义一个求给定矩阵中所有素数元素的函数文件 函数返回值为素数矩阵 如 p 10 99 q prime p p中所有素数构成q矩阵 练习7 设 编写一MATLAB函数文件fx m 使得调用f x 时 x可用矩阵代入 得出的f x 为同阶矩阵 练习8 在MATLAB中 函数可以嵌套调用 即一个函数可以调用别的函数 甚至调用它自身 一个函数调用它自身称为函数的递归调用 例4 16利用函数的递归调用 求n 递归调用函数文件factor m如下 functionf factor n ifn 1f 1 elsef factor n 1 n 递归调用求 n 1 end 例4 17任意排列问题 MATLAB提供的函数randperm n 可以产生一个从整数1到整数n的任意排列 编写一个函数来实现randperm n 函数的功能 即给出一个由任意数组成的行向量 然后产生这个行向量元素的任意排列 用函数的递归调用来实现该函数 functionY rndprm1 X RNDPRM2用递归调用产生一个行向量的任意排列 RNDPRM2 X 产生一个X的任意排列 m n size X len n ifm 1error RNDPRM2acceptsasinputsonlyvectors endifn 1Y X elsek 1 fix len rand 在 1 len 间随机选择Y的下一个元素的位置x X k 被选择的元素X k 从X中删除x元素Z rndprm1 X 将剩下的元素随机排列Y Z x 构造输出向量len len 1 end X 3 5 9 8 Y rndprm1 X Y 8953 用非递归来实现该函数 functionY rndprm2 X RNDPRM1用for循环产生一个行向量的任意排列 RNDPRM1 X 产生行向量X的任意排列 m n size X ifm 1error RNDPRM1acceptsasinputsonlyvectors endY 从一个空矩阵开始len n X的元素个数forp 1 nk 1 fix len rand 随机在 1 len 选择Y的下一个元素的位置x X k 被选择的元素Y Y x 将X添加到Y中X k 从X中删除x元素len len 1 更新X的元素个数end X 3 5 9 8 Y rndprm2 X Y 8953 4 3 3函数参数的可调性 在调用函数时 MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数 只要在函数文件中包含这两个变量 就可以准确地知道该函数文件被调用时的输入输出参数个数 从而决定函数如何进行处理 不要求 例4 18nargin用法示例 函数文件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 6 不要求 4 3 4全局变量与局部变量 全局变量用global命令定义 格式为 global变量名例4 19全局变量应用示例 先建立函数文件wadd m 该函数将输入的参数加权相加 functionf wadd x y globalALPHABETAf ALPHA x BETA y 在命令窗口中输入 globalALPHABETAALPHA 1 BETA 2 s wadd 3 5 全局变量的优点是 实现数据在不同函数之间的共享 全局变量的缺点是 破坏了函数对变量的封装 降低程序的可读性 给程序的调试和维护带来不便 尽量不要使用全局变量 4 4程序调试 Debug 4 4 1程序调试概述一般来说 应用程序的错误有两类 语法错误 例如函数名的拼写错 表达式书写错等 会给出错误提示 程序逻辑错误 不会给出任何提示信息 调试方法 设置断点 控制程序单步运行等 在此过程中查看 分析变量的中间结果 4 4 2MATLAB调试菜单 M文件编辑器除了能编辑修改文件外 还能对程序进行调试 1 控制单步运行 1 Step 单击一次 程序运行一行 但不进入函数 2 StepIn 遇到函数时进入函数内运行 3 StepOut 停止单步运行 跳出函数或直接运行到下一个断点 4 SaveandRun 5 GoUntilCursor 运行到光标所在行 2 断点操作 1 Set ClearBreakpoint 2 Set ModifyConditionalBreakpoint 3 Enable DisableBreakpoint 4 ClearBreakpointsinAllFiles 5 StopIfErrors Warnings 习题 作业 1 从键盘输入一个4位整数 按如下规则加密后输出 加密规则 每位数字都加上7 然后用和除以10的余数取代该数字 再把第一位与第三位交换 第二位与第四位交换 2 分别用if语句和switch语句实现以下计算 其中a b c的值从键盘输入 3 产生20个两位随机整数 输出其中小于平均值的偶数 提示 求平均值使用mean函数 作业中用到的函数max min sum prod mean自行查找帮助或相关资料 4 输入20个数 求其中最大数和最小数 要求分别用循环结构和调用MATLAB的max函数 min函数来实现 5 已知 分别用循环结构和调用MATLAB的sum函数求s的值 6 当n分别取100 1000 10000时 求下列各式的值 1 2 3 4 要求分别用循环结构和向量运算 使用sum和prod函数 来实现 7 编写一个函数文件 求小于任意自然数n的Fibnacci数列各项 Fibnacci数列定义如下 8 编写一个函数文件 用于求两个矩阵的乘积和点乘 然后在命令文件中调用该函数 9 分别用非递归函数和递归函数各定义一个函数文件求 然后调用这两个函数文件求 10 写出下列程序的输出结果 1 s 0 a reshape 12 23 4 3 fork aforj 1 4ifrem k j 2 0s s k j endendends 2 命令文件exe m globalxx 1 2 5 y 2 2 6 sub y xy函数文件sub m functionfun sub z globalxz 3 x x x z 程序调试

展开阅读全文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值