资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Matlab实训6程序设计1,MATLAB编程基础(续),6.1 概述,6.2 脚本文件,6.3 流程控制,6.4 函数文件,6.5 M文件调试,6.6 M文件性能分析,6.7 小结,6.1 概述,MATLAB,的工作模式,指令驱动模式,通常,MATLAB,以指令驱动模式工作,即在,MATLAB,命令行,窗口下用户输入单行指令时,,MATLAB,立即处理这条指令,这就是,MATLAB,命令行方式。,命令行方式程序可读性差,而且不能存储,,当处理复杂问题和大量数据时很不方便。,M,文件模式,将,MATLAB,语句构成的程序存储成以,m,为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。,程序文件不能在指令窗口下建立,因为指令窗口只允许一次执行一行上的一个或几个语句。,概述(续),MATLAB,通过,M,语言来实现完整的编写应用程序的能力,M,语言,M,语言是一种解释性语言,利用该语言编写的代码,仅能被,MATLAB,接受,被,MATLAB,解释、执行。,M,语言文件可以分为脚本文件和函数文件,一个,M,语言文件就是由若干,MATLAB,的命令组合在一,起构成的。,M,语言文件是标准的纯文本格式的文件,其文件扩,展名为,.m,。,使用,M,文件可以将一组,MATLAB,命令组合起来,通过,一个简单的指令就可以执行这些命令。,概述(续),MATLAB,提供了,meditor,编辑器编辑,M,文件,在,MATLAB,命令行窗口中键入指令,edit,,,则可启动,meditor,编辑器,edit,概述(续),通过“,File”,菜单中的“,New”,子菜单下的“,M-file”,命令来启,动,meditor,编辑器,直接单击,MATLAB,用户界面工具栏上的新建按钮,来启动,meditor,编辑器,概述(续),M,文件有两类,独立的,M,文件,脚本(,Scripts,),可调用,M,文件,函数(,Functions,),内建函数,利用高级语言开发的函数文件,MATLAB编程基础(续),6.1 概述,6.2 脚本文件,6.3 流程控制,6.4 函数文件,6.5 M文件调试,6.6 M文件性能分析,6.7 小结,6.2 脚本文件,包含MATLAB语言代码的文件称为 M文件,其扩展名为.m。,脚本文件就是由一系列的MATLAB指令和命令组成的纯文本格式的M文件。,脚本文件没有输入参数,也没有输出参数。,执行脚本文件时,文件中的指令或者命令按照出现在脚本文件中的顺序依次执行。,脚本文件(续),在脚本文件中,主要由注释行和代码行组成,M,文件的注释行需要使用,%,定义符,注释定义符仅能影响一行代码,M,文件的代码行是一些简单的,MATLAB,指令或命令,命令可以完成相应的计算处理数据、绘制图形结果的操作,可以在脚本文件中调用其他的函数完成复杂的数学运算,脚本文件的特点:所产生的变量均保留在基本工作空间中。,脚本文件(续),脚本文件中常用的MATLAB指令,指令,说明,pause,暂停当前M文件的运行,按任意键继续,input,等待用户输入,keyboard,暂停当前M文件的运行,并将程序控制权交还给MATLAB命令行,这时可以正常使用命令行,直到键入“return”并按回车键后,M文件才继续执行,return,返回当前的函数或者命令行,例子,脚本文件示例。,%注释行,%M脚本文件示例,%flower petal,%以下为代码行,%计算,theta=-pi:0.01:pi;,rho(1,:)=2*sin(5*theta).2;,rho(2,:)=cos(10*theta).3;,rho(3,:)=sin(theta).2;,rho(4,:)=5*cos(3.5*theta).3;,for k=1:4,%图形输出,subplot(2,2,k),polar(theta,rho(k,:),end,disp(程序运行结束!),保存为script_example.m,在MATLAB命令行中运行该脚本文件:,script_example,程序运行结束!,在脚本文件script_example,中运用pause、keyboard、,return指令。,MATLAB编程基础(续),6.1 概述,6.2 脚本文件,6.3 流程控制,6.4 函数文件,6.5 M文件调试,6.6 M文件性能分析,6.7 小结,6.3 流程控制,程序流程控制包含控制程序的基本结构和语法,结构化的程序主要有三种基本的程序结构,顺序结构,指所有组成程序源代码的语句按照由上至下的次序依次执行,直到程序的最后一个语句。,选择结构,依照不同的判断条件进行判断,然后根据判断的结果选择某一种方法来解决某一个问题。,循环结构,就是在程序中某一条语句或多条语句重复多次的运行。,MATLAB,语言的程序结构与其它高级语言是一致的,分为顺序结构、选择结构、循环结构,流程控制(续),6.3.1 顺序结构,6.3.2 选择结构,6.3.3 循环结构,6.3.4 break语句和continue语句,6.3.1 顺序结构,顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句。,涉及到数据的输入、数据的计算或处理、数据的输出等内容。,数据的输入:从键盘输入信息,则可使用,input,函数进行,数据的输出:主要函数有,disp,函数,调用格式:,disp,(,输出项,),输出项既可以是字符串,也可以是矩阵,例:,A=Hello,TOM!;B=1,2,3;4,5,6;,disp(A,),disp(B,),Hello,TOM!1 2 3,4 5 6,用,disp,函数进行显示时将不显示名字,而且其输出格式更紧凑,且不留任何没有意义的空行,顺序结构(续),例:输入X,Y的值,并将它们的值互换后输出,程序如下:,X=input(Input X please:);,Y=input(Input Y please:);,Z=X;,X=Y;,Y=Z;,disp(X);,disp(Y);,假设保存为SX1.m,程序输出为:,SX1,Input X please:,Input Y please:,2 3 4 5 6 7 8,3 3 4,43 6 4 -54,X,Y,12,3,3,4;43,6,3,-54,1:8,顺序结构(续),例:求一元二次方程 的根,程序如下:,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);,假设保存为SX2.m,程序输出为:,SX2,a=?:4,b=?:78,c=?:54,x1=-0.7188 x2=-18.7812,再一次运行程序输出为:,a=?:23,b=?:-6,c=?:51,x1=0.13043+1.4834i,x2=0.13043-1.4834i,顺序结构(续),程序的暂停,:当程序运行时,为了查看程序的中间结果或者观看输出的图形,有时需要暂停程序的执行,可以使用pause函数。,调用格式,:pause(延迟秒数),如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任意键后程序继续执行,6.3.2 选择结构,当需要判断某一条件是否满足,根据判断的结果来选择不同的解决方法时,则使用选择结构,MATLAB,的条件判断可以使用,if,语句或者,switch,语句,选择结构(续),6.3.2.1 if语句,if,语句的三种基本语法结构,if,(,关系运算表达式),MATLAB,语句,end,if,(,关系运算表达式),MATLAB,语句,A,else,MATLAB,语句,B,end,if,(,关系运算表达式,a,),MATLAB,语句,A,elseif,(,关系运算表达式,b,),MATLAB,语句,B,else,(,关系运算表达式,c,),end,if-,elseif,-else,的语句结构可以嵌套使用,if,(,关系运算表达式,a,),if,(,关系运算表达式,b,),MATLAB,语句,A,else MATLAB,语句,B,end,else,if,(,关系运算表达式,c,),MATLAB,语句,C,else MATLAB,语句,D,end,end,选择结构(续),运行程序:,if_examp,A=,?,例 if语句的使用,clear all,I=1;,J=2;,if I=J,A(I,J)=2;,elseif abs(I-J)=1,A(I,J)=-1;,else,A(I,J)=0;,end,A,选择结构(续),运行程序:,if_examp,A=,0 -1,例 if语句的使用,clear all,I=1;,J=2;,if I=J,A(I,J)=2;,elseif abs(I-J)=1,A(I,J)=-1;,else,A(I,J)=0;,end,A,选择结构(续),选择结构(续),运行程序:,if_examp2,Is 1,I is bigger than 0 but less than 2,例 嵌套使用的if结构,clear all,if 1,disp(Is 1),else,disp(Not 1),end,I=1;,if I,if I-2,disp(I is less than 0 but bigger than-2),end,end,选择结构(续),运行程序:,if_examp2,?,例 嵌套使用的if结构,clear all,if 1,disp(Is 1),else,disp(Not 1),end,I=,0,;,if I,if I-2,disp(I is less than 0 but bigger than-2),end,end,选择结构(续),运行程序:,if_examp2,Is 1,I is less than 0 but bigger than-2,例 嵌套使用的if结构,clear all,if 1,disp(Is 1),else,disp(Not 1),end,I=,0,;,if I,if I-2,disp(I is less than 0 but bigger than-2),end,end,选择结构(续),运行程序:,if_examp2,?,例 嵌套使用的if结构,clear all,if 1,disp(Is 1),else,disp(Not 1),end,I=,-1,;,if I,if I-2,disp(I is less than 0 but bigger than-2),end,end,选择结构(续),运行程序:,if_examp2,Is 1,I is bigger than 0 but less than 2,例 嵌套使用的if结构,clear all,if 1,disp(Is 1),else,disp(Not 1),end,I=,-1,;,if I,if I-2,disp(I is less than 0 but bigger than-2),end,end,选择结构(续),运行程序:,if_examp2,Not 1,I is bigger than 0 but less than 2,程序如何修改?,例 嵌套使用的if结构,clear all,if 1,disp(Is 1),else,disp(Not 1),end,I=1;,if I,if I-2,disp(I is less than 0 but bigger than-2),end,end,选择结构(续),6.3.2.2 switch语句,switch,语句用于处理多分支的选择,switch,(,表达式),case,常量表达式,a,:,MATLAB,语句,A,case,常量表达式,b,:,MATLAB,语句,B,case,常量表达式,m,:,MATLAB,语句,M,otherwise,:,MATLAB,语句,N,end,在,MATLAB,的,switch,语句中,程序仅仅执行符合条件的,case,分支,从代码的完整性和可靠性的角度出发,在使用,switch,语句时,一定要包含,otherwise,分支,选择结构(续),例 switch结构使用示例,clear all,algorithm=input(Enter an algorithm in quotes(ode23,ode15s,etc:);,switch algorithm,caseode23,str=2nd/3rd order;,caseode15s,ode23s,str=stiff system;,otherwise,str=other algorithm;,end,disp(str),switch_examp,Enter an algorithm in quotes(ode23,ode15s,etc:),2nd/3rd order,switch_examp,Enter an algorithm in quotes(ode23,ode15s,etc:),other algorithm,ode23,ode4,6.3.3 循环结构,在,MATLAB,中,包含两种循环结构,循环次数不确定,的,while,循环,循环次数确定的,for,循环,循环结构(续),1、while循环结构,while,语句可以实现“当”型的循环结构,格式,while,(,表达式),MATLAB,语句,end,特点是先判断循环条件,当循环条件成立,即表达式运算结果为“真”,再执行循环体,在循环过程中一定要有能够改变关系表达式或者布尔类型变量的值,循环结构(续),例 while结构使用示例,clear all,i=1;,sum=0;,while(i while_examp,计算结果为:500500,循环结构(续),2、for循环结构,使用,for,语句循环需要预先知道循环体执行的次数,格式,for index=start:increment:end,MATLAB,语句,end,index,的取值取决于,start,和,end,的值,在,for,循环语句中,不仅可以使用,行向量,进行循环迭代的处理,也可以使用,矩阵,作为循环次数的控制变量,循环的索引值将直接使用矩阵的每一列,循环的次数为矩阵的列数,例6-7,例6-8,循环结构(续),例 for结构使用示例,clear all,sum=0;,for i=1:1000,sum=sum+i;,end,str=计算结果为:,num2str(sum);,disp(str),for_examp,计算结果为:500500,使用行向量进行循环迭代,循环结构(续),例 for 循环示例,clear all,A=rand(3,4);,for i=A,sum=mean(i),end,使用矩阵的列数作为循环次数的控制变量,for_examp2,sum=,0.5960,sum=,0.7131,sum=,0.4321,sum=,0.6174,循环结构(续),例 for 循环示例,clear all,A=rand(3,4);,for i=A,sum=mean(i),end,i=A(:,1)i=A(:,2)i=A(:,3)i=A(:,4),for_examp2,sum=,0.5960,sum=,0.7131,sum=,0.4321,sum=,0.6174,使用矩阵的列数作为循环次数的控制变量,6.2.4 break语句和continue语句,break,语句和,continue,语句的基本功能,当,break,语句使用在循环体中的时候,其作用是能够在执行循环体的时候,强迫终止循环,,即控制程序的流程,使其,提前退出循环,使用方法:,break;,continue,语句出现在循环体中的时候,其作用是能够,中断本次的循环体,运行,将程序的流程跳转到判断循环条件的语句处,,继续下一次的循环,,直到所有的循环迭代运算结束,使用方法:,continue;,break语句和continue语句(续),例 break语句示例,clear all,i=0;,j=0;,k=0;,for i=1:2,for j=1:2,for k=1:2,if(k=2),disp(退出循环);,break;,end,str=sprintf(I=%d,J=%d,K=%d,i,j,k);,disp(str);,end,end,end,disp(程序运行结束),break语句和continue语句(续),运行,break_examp,I=1,J=1,K=1,I=1,J=1,K=1,退出循环,I=1,J=1,K=2,I=1,J=2,K=1,I=1,J=2,K=1,退出循环,I=1,J=2,K=2,I=2,J=1,K=1,I=2,J=1,K=1,退出循环,I=2,J=1,K=2,I=2,J=2,K=1,I=2,J=2,K=1,退出循环,I=2,J=2,K=2,程序运行结束,break语句和continue语句(续),例 continue语句示例,clear all,i=0;,for i=1:6,if(i3),continue,else,str=sprintf(I=%d,i);,disp(str);,end,end,str=sprintf(循环结束 I=%d,i);,disp(str),运行,continue_examp,?,break语句和continue语句(续),例 continue语句示例,clear all,i=0;,for i=1:6,if(i3),continue,else,str=sprintf(I=%d,i);,disp(str);,end,end,str=sprintf(循环结束 I=%d,i);,disp(str),运行,continue_examp,I=1,I=2,I=3,循环结束 I=6,break语句和continue语句(续),例(1),clear all,i=0;,for i=1:6,if(i3),break,else,str=sprintf(I=%d,i);,disp(str);,end,end,str=sprintf(循环结束 I=%d,i);,disp(str),运行例(1),continue_examp,?,break语句和continue语句(续),例(1),clear all,i=0;,for i=1:6,if(i3),break,else,str=sprintf(I=%d,i);,disp(str);,end,end,str=sprintf(循环结束 I=%d,i);,disp(str),运行例(1),continue_examp,I=1,I=2,I=3,循环结束 I=4,6.4 函数文件,M,语言函数文件能够接受用户的输入参数,进行计算,并将计算结果作为函数的返回值返回给调用者,在,MATLAB,中具有不同类型的函数文件,内建函数文件,系统,M,函数文件,系统,MEX,函数文件,用户自定义,MEX,函数文件,用户自定义的,M,函数文件,函数文件(续),MATLAB,的内建函数文件,MATLAB,自定义的函数文件称内建函数文件。,调用内建函数的方法:,使用函数名并给出相应的输入、输出参数即可。,例如:,sin.m,函数,调用格式:,y=sin(x),例:,x=0:2*pi/180:2*pi;,y=sin(2*x);,plot(x,y),用户自定义的,M,函数文件是由用户自己利用,M,语言编写的文件,系统,M,函数文件是由,MATLAB,提供的,M,语言函数文件,函数文件(续),本节介绍,6.4.1,基本结构,6.4.2,输入输出参数,6.4.3,子函数,6.4.4,局部变量和全局变量,6.4.5,函数执行规则,函数文件(续),M,语言函数文件具有下面的不同部分,函数定义行,在线帮助,注释行,M,语言代码,6.4.1 基本结构,函数m文件的格式:,function 返回变量=函数名(输入变量),注释说明语句段,程序语句段,特定规则:,1)函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:function=(),2)程序中的变量均为局部变量,不保存在工作空间中,其变量只在函数运行期间有效。,基本结构(续),001 function y=average(x),002%AVERAGE 求向量元素的均值,003%语法:,004%Y=average(X),005%其中,X是向量,Y为计算得到向量元素的均值,006%若输入参数为非向量则出错,007,008%代码行,009 m,n=size(x);,010%判断输入参数是否为向量,011 if(,(m=1)|(n=1)|(m=1&n=1),),012%若输入参数不是向量,则出错,013 error(Input must be a vector),014 end,015%计算向量元素的均值,016 y=sum(x)/length(x);,例 函数文件示例,函数定义行,001 function y=average(x),包括,关键字,function,函数输出参数,y,函数名称,average,函数输入参数,x,函数名称定义要求,必须以字符开头,后面可以用字符、数字和下划线的组合构成函数名称,MATLAB,对函数名称的长度有限定,函数的,M,文件名称最好和函数名称保持一致,若不一致,则调用函数时需要,使用文件名称而非函数名称,。,基本结构(续),在线帮助,M,函数文件的在线帮助为紧随在函数定义行的注释行,002%AVERAGE,求向量元素的均值,003%,语法:,004%Y=average(X),005%,其中,,X,是向量,,Y,为计算得到向量元素的均值,006%,若输入参数为非向量则出错,基本结构(续),若在,MATLAB,命令行窗口中键入指令,help average,则,help average,AVERAGE,求向量元素的均值,语法:,Y=average(X),其中,,X,是向量,,Y,为计算得到向量元素的均值,若输入参数为非向量则出错,基本结构(续),注释行,008%,代码行,010%,判断输入参数是否为向量,012%,若输入参数不是向量,则出错,015%,计算向量元素的均值,注释行不会显示在在线帮助中,主要原因是这些注释行没有紧随在,H1,帮助行的后面,基本结构(续),M,语言代码,008%,代码行,009 m,n=size(x),010%,判断输入参数是否为向量,011 if(m=1)|(n=1)|(m=1&n=1),012%,若输入参数不是向量,则出错,013 error(Input must be a vector),014 end,015%,计算向量元素的均值,016 y=sum(x)/length(x),代码行需要完成具体的算法,实现用户的具体功能,基本结构(续),
展开阅读全文