MATLAB7.0第四讲ppt课件

上传人:大米 文档编号:568744210 上传时间:2024-07-26 格式:PPT 页数:42 大小:510KB
返回 下载 相关 举报
MATLAB7.0第四讲ppt课件_第1页
第1页 / 共42页
MATLAB7.0第四讲ppt课件_第2页
第2页 / 共42页
MATLAB7.0第四讲ppt课件_第3页
第3页 / 共42页
MATLAB7.0第四讲ppt课件_第4页
第4页 / 共42页
MATLAB7.0第四讲ppt课件_第5页
第5页 / 共42页
点击查看更多>>
资源描述

《MATLAB7.0第四讲ppt课件》由会员分享,可在线阅读,更多相关《MATLAB7.0第四讲ppt课件(42页珍藏版)》请在金锄头文库上搜索。

1、雷达信号处理国防科技重点实验室雷达信号处理国防科技重点实验室Programming Design for MATLABProgramming Design for MATLAB1.第四章第四章第四章第四章 MATLABMATLAB程序设计技术程序设计技术程序设计技术程序设计技术u4.1 MATLAB程序设计初步u4.2 流程控制u4.3 用户参数交互输入u4.4 程序设计技术u4.5 MATLAB程序调试技术24.1 MATLAB4.1 MATLAB程序设计初步程序设计初步一、脚本文件和函数文件u将MATLAB命令窗口中一行一行输入的命令汇集在一个文件中,这样一来要输入这一组命令时,只需输入这

2、一文件名。这种文件称为MATLAB的脚本文件,其文件扩展名为.m 。u另一类非常重要的M文件是MATLAB函数文件,它由五部分构成u函数定义行uH1行u函数帮助文本u函数体u注释34.1 MATLAB4.1 MATLAB程序设计初步(续)程序设计初步(续)脚本文件(stat1.m):% 求阵列x的平均值和标准差%m,n=size(x);if m=1 m=n;ends1=sum(x); s2=sum(x.2);mean1=s1/m;stdev=sqrt(s2/m-mean1.2);举例44.1 MATLAB4.1 MATLAB程序设计初步(续)程序设计初步(续)函数文件(stat2.m):fun

3、ction mean1,stdev=stat2(x)%函数定义行% 求阵列x的平均值和标准差%H1 行% 调用格式为|% mean,stdev=stat2(x) | 函数帮助文本 m,n=size(x);%以下为函数体,其中可包含注释if m=1 m=n;ends1=sum(x); s2=sum(x.2);mean1=s1/m;stdev=sqrt(s2/m-mean1.2);54.1 MATLAB4.1 MATLAB程序设计初步(续)程序设计初步(续)二、函数工作空间 对以上的脚本文件stat1.m和函数文件stat2.m, 分别执行后, 发现执行stat1.m时, 产生了所有由stat1.

4、m产生的变量, 而执行stat2.m则只产生函数返回的结果变量, 其它由函数文件产生的变量只存在于特定的函数工作空间中。 这样,利用MATLAB函数设计程序时,只需考虑由函数返回的结果变量,方便设计人员;但同时也给调试程序带来了不便,幸好MATLAB给程序设计提供了专用的调试器。64.1 MATLAB4.1 MATLAB程序设计初步(续)程序设计初步(续)在每个函数工作空间中,可能有三类变量:u输入输出变量,与上一级函数或主程序交换数据;u在函数内临时产生的变量(称局部变量);u由调用函数、主程序或其它函数定义的全局变量。全局变量应用global定义,例如: global alpha,beta

5、,x,y74.1 MATLAB4.1 MATLAB程序设计初步(续)程序设计初步(续)三、子函数 在一个函数文件中,可包含多个函数,其中第一个函数名应与文件名同名,其余函数统称为这一函数的子函数,它们只能在这一函数内部才能使用。 例如:84.1 MATLAB4.1 MATLAB程序设计初步(续)程序设计初步(续)function avg,med = mmval(u) %主函数% Find mean and median with internal functions.n = length(u);avg = mean(u,n);med = median(u,n);function a = mea

6、n(v,n) %子函数% Calculate average.a = sum(v)/n;function m = median(v,n) %子函数% Calculate median.w = sort(v);if rem(n,2) = 1m = w(n+1)/2);elsem = (w(n/2)+w(n/2+1)/2;end94.24.2流程控制流程控制流程控制语句可改变程序执行的流程,MATLAB有四类流程控制语句:uif,else,elseif,end 条件转移语句;uswitch,case,otherwise,end 情况切换语句;ufor,end指定次重复的循环语句;uwhile,en

7、d 不定次重复的循环语句。这些语句给MATLAB程序设计带来了极大的方便,也给设计带来了灵活性。104.24.2流程控制(续)流程控制(续)一、条件语句常用的格式为: if a0 disp(a为正数) else disp(a为零) end可根据a的不同取值, 进行不同的处理。 If语句还可以嵌套使用。114.24.2流程控制(续)流程控制(续)二、情况切换语句switch语句可根据表达式的不同取值执行不同的语句,这相当于多条if语句的嵌套使用。例如:switch var1case -1 disp(Var1 is negative one.)case 0 disp(Var1 is zero.)c

8、ase 1 disp(Var1 is positive one.)otherwise disp(Var1 is other value.)end124.24.2流程控制(续)流程控制(续)在case语句中可出现多个值, 例如switch var2case -2,-1 disp(Var2 is negative one or two.)case 0 disp(Var2 is zero.)case1,2,3 disp(Var2 is positive one, two or three.)otherwise disp(Var2 is other value.)end134.24.2流程控制(续)流

9、程控制(续)Switch语句还可以出现字符串, 例如:switch lower(method)caselinear,bilinear disp(Method is linear.)casecubic disp(Method is cubic.)casenearest disp(Method is nearest.)otherwise disp(Unknown method.)end14三、指定次重复循环语句for语句用于完成指定次的重复循环语句,这是大家所熟知的形式。例如计算20!:r=1; for k=1:20 r=r*k; enddisp(r)计算结果为:2.4329e+0184.24.2

10、流程控制(续)流程控制(续)154.24.2流程控制(续)流程控制(续)for语句还可以利用数组(即阵列)任意指定循环变量的值, 例如varx=-5 2 8 1 7; for x=varx disp(x.2-5*x); end计算结果为: 50 -6 24 -4 14164.24.2流程控制(续)流程控制(续)For循环可以嵌套使用. 例如采用二重循环可方便地进行数据的排序:x=fix(100*rand(1,10); disp(x)n=length(x);for i=1:n for j=n:-1:i+1 if x(j)x(j-1) y=x(j);x(j)=x(j-1);x(j-1)=y; en

11、d endenddisp(x)计算结果为: 61 79 92 73 17 40 93 91 41 89 93 92 91 89 79 73 61 41 40 17注意, 在MATLAB中, 可利用sort函数对数据进行排序: sort(x)17For循环中可采用break语句来终止循环,如上例中可利用break提高执行效率:x=fix(100*rand(1,10); disp(x)n=length(x); for i=1:n flag=-1; for j=n:-1:i+1 if x(j)x(j-1) y=x(j);x(j)=x(j-1);x(j-1)=y;flag=0; end end if

12、flag,break,endenddisp(x),disp(循环次数为,num2str(i)循环次数为7184.24.2流程控制(续)流程控制(续)四、不定次重复循环语句while语句可执行不定次重复的循环,它与for循环不同,在每次徇环前要判别其循环条件,当条件为真时或非零值时,重复循环;否则结束循环。因此,在while循环中,可通过改变循环变量来改变循环次数;但在for循环中,虽然也可以改变其循环变量,但其循环次数不受其影响例如:r=1; k=1;while r1e50 r=r*k; k=k+1;endk=k-1; r=r./k; k=k-1; disp( The ,num2str(k),

13、! is ,num2str(r)The 41! Is 3.345253e049194.24.2流程控制(续)流程控制(续)var=1 2 3 4 5 6 -1 7 8 0;a=; k=1;while var(k) if var(k)=-1, break, end a=a var(k).2; k=k+1;enddisp(a)1 4 9 16 25 36注意: break还可用于for循环!204.3 4.3 用户参数交互输入用户参数交互输入用户输入参数的方法有三种:u利用input函数输入;u利用menu函数制作交互输入的菜单;u利用keyboard命令进入键盘主控状态,直接修改或输入变量。前两

14、种方法用得比较多。 214.3 4.3 用户参数交互输入用户参数交互输入 一、input例如: f=input ( frequency is ) %可带提示字串m=input ( methodsn1- linearn2 - bilinearn3- othersn )methods1- linear2 - bilinear3- others224.3 4.3 用户参数交互输入(续)用户参数交互输入(续)二、menus=menu ( color selection,red,green,blue,yellow,black )switch scase 1, scolor=red;case 2, sco

15、lor=green;case 3, scolor=blue;case 4, scolor=yellow;case 5, scolor=black;otherwise disp(Error!)endscolor234.4 4.4 程序设计技术程序设计技术 MATLAB语言与其它语言一样,程序设计的好坏,直接影响程序的执行效率。我们结合多年利用MATLAB进行编程的经验,给大家介绍两种行之有效的设计技术。J循环的向量化;J阵列预分配。244.4 4.4 程序设计技术(续)程序设计技术(续)一、循环的向量化实际应用中,有些循环可直接转换成向量,这时可大大提高程序的执行效率。因此编程时,尽量采用向量或

16、矩阵操作,而应避免循环。为测试程序执行的快慢,可采用tic和toc函数。例如:tici=0;for t=0:.01:100 i=i+1;y(i)=sin(t);endtoctict=0:.01:100;y=sin(t);toc执行时间分别为 7.58 0.01254.4 4.4 程序设计技术(续)程序设计技术(续)二、阵列预分配 虽说在MATLAB下无须给结果阵列预定义尺寸,它会随着存储数据的增多,自动增加其尺寸,但这要付出增加执行时间的代价,有时甚至是惨重的代价。例如,求下列离散系统在正弦输入下的输出: y(k)=0.75y(k-1)-0.125y(k-2)+2u(k)我们可编写出脚本文件:

17、264.4 4.4 程序设计技术(续)程序设计技术(续)clear, ticT=0.001;t=0:T:8; u=sin(2*pi*t);% y=zeros(size(u);for k=1:fix(8/T)+1; if k=1 y(k)=2*u(k); elseif k=2 y(k)=2*u(k)+.75*y(k-1); else y(k)=2*u(k)+.75*y(k-1)-.125*y(k-2); endendtime=tocfigure(1)subplot(2,1,1)plot(t,u),title(Input u)subplot(2,1,2)plot(t,y),title(Output

18、 y)274.4 4.4 程序设计技术(续)程序设计技术(续)在没预分配y阵列时, 其执行时间为 time=7.5200在对y进行预分配后,其执行时间为 time=1.3700执行后的结果曲线为284.5 4.5 程序调试技术程序调试技术MATLAB的调试器(debugger)可帮助你尽快找到编程的错误。MATLAB的程序调试主要用来纠正两类错误:u格式错误(语法错误),这在程序运行时就会直接给出提示u运行错误,体现在执行结果不对,执行时出现异常。Debugger主要用来诊断第二类错误。294.5 4.5 程序调试技术(续)程序调试技术(续)在包含函数调用的MATLAB程序运行时,当发生运行错

19、误时,不会显示出错信息,而在执行结束或出错时,我们只能看到基本工作空间(即主程序执行空间)中的变量,各个函数工作空间已关闭,因此无法检测各个局部变量。为此,应采用调试技术来查找问题。304.5 4.5 程序调试技术(续)程序调试技术(续)为查找运行错误,可采用下列技术:u在可能发生错误的M文件中,删去某些语句行末的分号,使显示其运行中间结果,从中可发现一些问题;u在M文件的适当位置上加上keyboard命令,使在执行时在此暂停,从而检查局部工作空间中变量的内容,从中找到出错的线索,利用return命令可恢复程序的执行;u注释掉M函数文件的函数定义行,使函数文件转变成脚本文件,这样在程序运行出错

20、时,可查看M文件产生的中间变量;注意,局部变量之间应避免冲突;314.5 4.5 程序调试技术(续)程序调试技术(续)为查找运行错误,可采用下列技术: (续)u使用MATLAB提供的Debugger,Debugger为我们提供了下列功能:P设置清除断点;P单步执行;P继续执行;P查看和修改各个函数空间的内容。为说明MATLAB的调试技术,我们通过一简单示例加以说明:324.5 4.5 程序调试技术(续)程序调试技术(续)编写估计输入数据向量的无偏方差,函数文件名为variance.m:function y=variance(x)mu=sum(x)/length(x);tot=sqsum(x,m

21、u);y=tot/(length(x)-1);它又调用了一个计算输入数据向量均方和的函数sqsum.mfunction tot=sqsum(x,mu)tot=0;for i=1:length(mu) tot=tot+(x(i)-mu).2);end注意,这里有意包含了错误。334.5 4.5 程序调试技术(续)程序调试技术(续)当输入为 v=1 2 3 4 5; 时,可计算出其方差应为2.5现在,试着利用variance函数计算: var1=variance(v)var1= 1这说明程序有错!下面分步骤讨论调试,并且结合我个人编程的经验,给出调试思路。344.5 4.5 程序调试技术(续)程序

22、调试技术(续)第一步: 分段设置断点一开始并不能肯定问题所在,我们总是按照执行顺序分段执行,以期望能够找到出错的程序段。为此在variance.m中设置断点,并执行程序:354.5 4.5 程序调试技术(续)程序调试技术(续)var2=variance(v)K tot tot = 4正确结果应为tot=10,说明由sgsum函数计算的均方和有错!K dbcont继续执行,使程序正常结束。364.5 4.5 程序调试技术(续)程序调试技术(续)第二步:清除断点第三步:调试嵌套函数在sgsum.m中的第4行设置断点,并执行,这时程序暂停于断点处。374.5 4.5 程序调试技术(续)程序调试技术(

23、续)四、单步执行点击单步执行,这时左边的黄色箭头用于指示下一条待执行的指令。执行3步就从sgsum返回到variance,说明只执行了一次循环,这与设计不符。仔细检查这一循环语句,发现for i=1:length(mu)实际上应为for i=1:length(x)384.5 4.5 程序调试技术(续)程序调试技术(续)五、修改并重新执行 找到了问题所在,修改源程序并重新执行,如仍有问题,继续上述过程进行调试,直到程序执行正确。但要注意,对某一特定值,程序得到了正确的结果,并不是说程序完全正确。394.5 4.5 程序调试技术(续)程序调试技术(续)程序调试技术总结: 1. 程序编写出来,并不意

24、味着设计任务的结束; 2. 编写程序是容易的,但调试程序是一个复杂而困难的; 3. 调试程序是一个需要多次反复的任务, 应确保每个支路都能正常工作, 要做到这一点并不容易; 4. 程序调试技术应在不断实践中积累经验。40第二次上机作业第二次上机作业 第3章u练习产生图3.13.5, 3.93.12, 3.143.18,3.21,3.22, 3.243.31并练习图形旋转、标注、复制等功能第3章习题(P146)u5,7,9u交结果:与习题7类似,只是画出你自己上个月的消费饼图41第二次上机作业第二次上机作业 第4章 u上机前好好复习这章内容,练习P163页的两段程序,并将终值扩大到500,体会两者的速度差异。u熟悉MATLAB的调试技术。第4章习题: (P184) u1,3,5,8,9u交结果:3;5,8(分别求出当I54,I105时的结果);942

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号