您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > matlab > MATLAB7.0第四讲
西安电子科技大学雷达信号处理国防科技重点实验室ProgrammingDesignforMATLAB第四章MATLAB程序设计技术4.1MATLAB程序设计初步4.2流程控制4.3用户参数交互输入4.4程序设计技术4.5MATLAB程序调试技术4.1MATLAB程序设计初步一、脚本文件和函数文件将MATLAB命令窗口中一行一行输入的命令汇集在一个文件中,这样一来要输入这一组命令时,只需输入这一文件名。这种文件称为MATLAB的脚本文件,其文件扩展名为.m。另一类非常重要的M文件是MATLAB函数文件,它由五部分构成函数定义行H1行函数帮助文本函数体注释4.1MATLAB程序设计初步(续)脚本文件(stat1.m):%求阵列x的平均值和标准差%[m,n]=size(x);ifm==1m=n;ends1=sum(x);s2=sum(x.^2);mean1=s1/m;stdev=sqrt(s2/m-mean1.^2);举例4.1MATLAB程序设计初步(续)函数文件(stat2.m):function[mean1,stdev]=stat2(x)%函数定义行%求阵列x的平均值和标准差%H1行%调用格式为|%[mean,stdev]=stat2(x)|函数帮助文本[m,n]=size(x);%以下为函数体,其中可包含注释ifm==1m=n;ends1=sum(x);s2=sum(x.^2);mean1=s1/m;stdev=sqrt(s2/m-mean1.^2);4.1MATLAB程序设计初步(续)二、函数工作空间对以上的脚本文件stat1.m和函数文件stat2.m,分别执行后,发现执行stat1.m时,产生了所有由stat1.m产生的变量,而执行stat2.m则只产生函数返回的结果变量,其它由函数文件产生的变量只存在于特定的函数工作空间中。这样,利用MATLAB函数设计程序时,只需考虑由函数返回的结果变量,方便设计人员;但同时也给调试程序带来了不便,幸好MATLAB给程序设计提供了专用的调试器。4.1MATLAB程序设计初步(续)在每个函数工作空间中,可能有三类变量:输入/输出变量,与上一级函数或主程序交换数据;在函数内临时产生的变量(称局部变量);由调用函数、主程序或其它函数定义的全局变量。全局变量应用global定义,例如:globalalpha,beta,x,y4.1MATLAB程序设计初步(续)三、子函数在一个函数文件中,可包含多个函数,其中第一个函数名应与文件名同名,其余函数统称为这一函数的子函数,它们只能在这一函数内部才能使用。例如:4.1MATLAB程序设计初步(续)function[avg,med]=mmval(u)%主函数%Findmeanandmedianwithinternalfunctions.n=length(u);avg=mean(u,n);med=median(u,n);functiona=mean(v,n)%子函数%Calculateaverage.a=sum(v)/n;functionm=median(v,n)%子函数%Calculatemedian.w=sort(v);ifrem(n,2)==1m=w((n+1)/2);elsem=(w(n/2)+w(n/2+1))/2;end4.2流程控制流程控制语句可改变程序执行的流程,MATLAB有四类流程控制语句:if,else,elseif,end条件转移语句;switch,case,otherwise,end情况切换语句;for,end指定次重复的循环语句;while,end不定次重复的循环语句。这些语句给MATLAB程序设计带来了极大的方便,也给设计带来了灵活性。4.2流程控制(续)一、条件语句常用的格式为:ifa0disp(‘a为负数’)elseifa0disp(‘a为正数’)elsedisp(‘a为零’)end可根据a的不同取值,进行不同的处理。If语句还可以嵌套使用。4.2流程控制(续)二、情况切换语句switch语句可根据表达式的不同取值执行不同的语句,这相当于多条if语句的嵌套使用。例如:switchvar1case-1disp(‘Var1isnegativeone.’)case0disp(‘Var1iszero.’)case1disp(‘Var1ispositiveone.’)otherwisedisp(‘Var1isothervalue.’)end4.2流程控制(续)在case语句中可出现多个值,例如switchvar2case{-2,-1}disp('Var2isnegativeoneortwo.')case0disp('Var2iszero.')case{1,2,3}disp('Var2ispositiveone,twoorthree.')otherwisedisp('Var2isothervalue.')end4.2流程控制(续)Switch语句还可以出现字符串,例如:switchlower(method)case{'linear','bilinear'}disp('Methodislinear.')case{'cubic'}disp('Methodiscubic.')case{'nearest'}disp('Methodisnearest.')otherwisedisp('Unknownmethod.')end三、指定次重复循环语句for语句用于完成指定次的重复循环语句,这是大家所熟知的形式。例如计算20!:r=1;fork=1:20r=r*k;enddisp(r)计算结果为:2.4329e+0184.2流程控制(续)4.2流程控制(续)for语句还可以利用数组(即阵列)任意指定循环变量的值,例如varx=[-52817];forx=varxdisp(x.^2-5*x);end计算结果为:50-624-4144.2流程控制(续)For循环可以嵌套使用.例如采用二重循环可方便地进行数据的排序:x=fix(100*rand(1,10));disp(x)n=length(x);fori=1:nforj=n:-1:i+1ifx(j)x(j-1)y=x(j);x(j)=x(j-1);x(j-1)=y;endendenddisp(x)计算结果为:6179927317409391418993929189797361414017注意,在MATLAB中,可利用sort函数对数据进行排序:sort(x)For循环中可采用break语句来终止循环,如上例中可利用break提高执行效率:x=fix(100*rand(1,10));disp(x)n=length(x);fori=1:nflag=-1;forj=n:-1:i+1ifx(j)x(j-1)y=x(j);x(j)=x(j-1);x(j-1)=y;flag=0;endendifflag,break,endenddisp(x),disp(['循环次数为',num2str(i)])循环次数为74.2流程控制(续)四、不定次重复循环语句while语句可执行不定次重复的循环,它与for循环不同,在每次徇环前要判别其循环条件,当条件为真时或非零值时,重复循环;否则结束循环。因此,在while循环中,可通过改变循环变量来改变循环次数;但在for循环中,虽然也可以改变其循环变量,但其循环次数不受其影响例如:r=1;k=1;whiler1e50r=r*k;k=k+1;endk=k-1;r=r./k;k=k-1;disp(['The',num2str(k),'!is',num2str(r)])The41!Is3.345253e+0494.2流程控制(续)var=[123456-1780];a=[];k=1;whilevar(k)ifvar(k)==-1,break,enda=[avar(k).^2];k=k+1;enddisp(a)149162536注意:break还可用于for循环!4.3用户参数交互输入用户输入参数的方法有三种:利用input函数输入;利用menu函数制作交互输入的菜单;利用keyboard命令进入键盘主控状态,直接修改或输入变量。前两种方法用得比较多。4.3用户参数交互输入一、input例如:f=input(‘frequencyis’)%可带提示字串m=input(‘methods\n1---linear\n2---bilinear\n3---others\n’)methods1---linear2---bilinear3---others4.3用户参数交互输入(续)二、menus=menu('colorselection','red','green','blue','yellow','black’)switchscase1,scolor='red';case2,scolor='green';case3,scolor='blue';case4,scolor='yellow';case5,scolor='black';otherwisedisp('Error!')endscolor4.4程序设计技术MATLAB语言与其它语言一样,程序设计的好坏,直接影响程序的执行效率。我们结合多年利用MATLAB进行编程的经验,给大家介绍两种行之有效的设计技术。循环的向量化;阵列预分配。4.4程序设计技术(续)一、循环的向量化实际应用中,有些循环可直接转换成向量,这时可大大提高程序的执行效率。因此编程时,尽量采用向量或矩阵操作,而应避免循环。为测试程序执行的快慢,可采用tic和toc函数。例如:tici=0;fort=0:.01:100i=i+1;y(i)=sin(t);endtoctict=0:.01:100;y=sin(t);toc执行时间分别为7.580.014.4程序设计技术(续)二、阵列预分配虽说在MATLAB下无须给结果阵列预定义尺寸,它会随着存储数据的增多,自动增加其尺寸,但这要付出增加执行时间的代价,有时甚至是惨重的代价。例如,求下列离散系统在正弦输入下的输出:y(k)=0.75y(k-1)-0.125y(k-2)+2u(k)我们可编写出脚本文件:4.4程序设计技术(续)clear,ticT=0.001;t=[0:T:8];u=sin(2*pi*t);%y=zeros(size(u));fork=1:fix(8/T)+1;ifk==1y(k)=2*u(k);elseifk==2y(k)=2*u(k)+.75*y(k-1);elsey(k)=2*u(k)+.75*y(k-1)-.125*y(k-2);endendtime=tocfigure(1)subplot(2,1,1)plot(t,u),title('Inputu')subplot(2,1,2)plot(t,y),title('Outputy')4.4程序设计技术(续)在没预分配y阵列时,其执行时间为time=7.5200在对y进行预分配后,其执行时间为time=1.3700执行后的结果曲线为4.5程序调试技术MATLAB的调试器(debugger)可帮助你尽快找到编程的错误。MATLAB的程序调试主要用来纠正两类错误:格式错误(语法错误),这在程序运行时就会直接给出提示运行错误,体现在执行结果不对,执行时出现异常。Debugger主要用来诊断第二类错误。4.5程序调试技术(续)在包含函数调用的MATLAB程序运行时,当发生运行错误时,不会显示出错信息,而在执行结束或出错时,我们只能看到基本工作空间(即主程序执行空间)中的变量,各个函数工作空间已关闭,因此无法检测各个局部变量。为此,应采用调试技术来查找问题。4.5程序调试技术(续)为查找运行错误,可采用下列技术:在可能发生错误的M文件中,删去某些语句行末的分号,使显示其运行中间结果,从中可发现一些问题;在M文件的适当位置上加上keyboard命令,使在执行时在此暂停,从而检查局部工作空间中变量的内容,从中找到出
本文标题:MATLAB7.0第四讲
链接地址:https://www.777doc.com/doc-7028237 .html