1第六讲MATLAB程序设计6.1命令文件与函数文件(M文件)根据调用方式,M文件分为命令文件和函数文件两种。命令文件:命令文件没有输入参数和输出参数,只是一系列命令行的堆积或集合。系统执行命令文件的效果与在命令窗口中一条一条输入这些命令的效果相同,命令文件产生的所有变量都会保留在工作空间里命令文件的调用方法:在MATLAB的命令窗口中直接输入文件名(filename),按Enter键即可。举例:x=0:1/(10*pi):2*pi;y1=sin(x);plot(x,y1,'ro-');title('sin(x)');xlabel('x轴');ylabel('y轴');legend('y1=sin(x)');M函数:M函数是为了计算过程中参数的传递、程序的嵌套调用而编写的M文件。它用来定义一个函数,定义过程中必须指定函数名和输入输出参数,并由MATLAB语句序列给出一系列的操作和处理,从而生成所需要的数据。M函数文件包括:1、函数定义行。表明该M文件包含一个函数,并且定义函数名、输入和输出参数。2、函数体。是所有计算过程和输入输出参数赋值的MATLAB代码。3、注释。注释语句以“%”开头,可以出现在M文件的任何地方。%后的部分为不执行部分。注:1)M函数返回参数多于一个变量时,应使用方括号;2)输入变量多于一个时,用“,”隔开;3)函数名与M文件名应同名;24)一个函数文件只能定义一个M函数。【例6.1-1】建立函数文件ex5_1.mfunctiony=ex5_1(t)y=sin(t).*exp(-t);(注意:文件名一定用ex5_1)调用(另编一个程序,或在命令窗口输入):t=0:pi/50:pi;y=ex5_1(t);plot(t,y);【例6.1-2】建立函数文件ex5_2.mfunctiony=ex5_2(a,t)ifa==1y=sin(t);elseifa==2y=sin(t).*exp(-t);elsey=cos(t).*sin(t);endplot(t,y);调用:t=0:pi/50:pi;a=1;y=ex5_2(a,t);【例6.1-3】建立函数文件ex5_3.m,该m文件在ex5_3m.m中调用function[y1,y2,y3]=ex5_3(t)y1=sin(t);y2=sin(t).*exp(-t);y3=cos(t).*sin(t);调用程序:clear;t=0:pi/50:2*pi;[s1,s2,s3]=ex5_3(t);plot(t,s1,t,s2,t,s3);举例:1、MFunExam_drawLine.m——无输入输出参数2、定义一个名为fun_Exam.m的函数文件,并调用该函数(callFunExma.m)。36.2变量与数据类型1、变量变量是任何程序设计语言的基本单位。与一般程序设计语言不同的是,MATLAB语言并不要求事先对所使用的变量进行声明,也不需要指定变量类型,MATLAB语言自动依据变量值或对变量操作来识别变量类型。在赋值过程中,如果赋值变量已经存在,MATLAB语言将使用新值代替旧值,并以新值类型代替旧值类型。注:1)变量名区分大小写;2)变量名必须以字母开头,不能超过31位;3)变量存在作用区域。在未加特殊说明的情况下,变量为局部变量,即仅在其使用的M文件内有效;要将变量定义为全局变量,应当对变量进行说明,即在变量名前加关键字global。举例:编写一个应用全局变量求销售额总指数的函数,并调用。globalVarFun.mcall_globalVarFun.m2、数据类型double双精度浮点型single单精度浮点型float单精度或双精度浮点型int8有符号8位整型-27to27-1int16有符号16位整型-215to215-1int32有符号32位整型-231to231-1int64有符号64位整型-263to263-1unit8无符号8位整型0to28-1unit16无符号16位整型0to216-1unit32无符号32位整型0to232-1unit64无符号64位整型0to264-1char字符型logical逻辑型0or1cell细胞数组struct结构数组6.3细胞数组与结构数组41、细胞数组细胞数组是以单元为元素的数组,每个元素成为单元,每个单元可以包含其他类型数组,如:矩阵、字符串、复数。细胞数组由{}创建,其数据通过数组下标引用。【例6.3-1】建立1个2×2的细胞数组。clear;a(1,1)={3+2i};a(1,2)={'time'};a(2,1)={[123]};a(2,2)={[1.234;2.456;3.789]};a运行结果:a=[3.0000+2.0000i]'time'[1x3double][3x1double]a(2,2)运行结果:ans=[3x1double]a{2,2}运行结果:ans=1.23402.45603.7890【例6.3-2】建立1个1×3的细胞数组。b={'name'[2;3;4]2+5i};b运行结果:b='name'[3x1double][2.0000+5.0000i]2、结构数组结构数组是根据属性名(field)组织起来的不同类型数据的集合。结构数组的任何一个属性可以包括不同数据类型,如字符串、矩阵、标量等。调用格式:1)s=struct(‘field1’,{},’field2’,{},……)5表示建立一个空的结构数组,不含数据;2)s=struct('field1',values1,'field2',values2,'field3',values3,…)表示建立一个具有属性名和数据的结构数组。【例6.3-3】结构数组student=struct('name',{'Liu','Wang'},'Age',{'20','21'});求student(1)、student(2)、student.name。student=struct('name',{'Liu','Wang'},'Age',{'20','21'});student(1)ans=name:'Liu'Age:'20'student(2)ans=name:'Wang'Age:'21'student.nameans=Liuans=Wangstudent(2).nameans=Wangstudentstudent=1x2structarraywithfields:nameAgestudent(3).name=’Song’;student(3)ans=name:'Song'Age:[]6.4运算符1、算数运算符6+、-、*、.*、^、.^、\、.\、/、./;2、关系运算符==(等于)、~=(不等于)、(大于)、=(大于等于)、(小于)、=(小于等于)。说明:关系运算符主要用来对矩阵与数、矩阵与矩阵进行比较,返回二者的关系,1表示满足指定关系,0表示不满足指定关系。例:矩阵a=[12;23],求a中等于2的元素的个数n。a=[12;23];b=a==2b=0110n=sum(sum(b))n=23、逻辑运算符&(逻辑与)、|(逻辑或)、~(逻辑非)、xor(逻辑异或);MATLAB中,所有非零数值均被认为为真,零为假;在逻辑判断结果中,判断为真时输出“1”,判断为假时输出“0”。例:矩阵a=[11;01],b=[01;00],c=0,求c1=a﹠c,c2=a|c,c3=xor(a,b),c4=~aa=[11;01];b=[01;00];c=0;c1=a&cans=0000c2=a|cans=1101c3=xor(a,b)ans=1001c4=~aans=0010考虑:如果,a=[32;04],b=[05;00],结果又如何?76.5程序结构6.5.1顺序结构顺序结构是由简单的赋值语句和函数组成的最简单的控制语句。在程序执行时按照顺序从头至尾地执行程序中的各条语句。顺序结构一般不包含其他任何子语句或控制语句,也不需要用户输入任何参数。例:t=0:pi/50:2*pi;y1=sin(t);y2=sin(t).*exp(-t);y3=cos(t).*sin(t);plot(y1);holdon;plot(t,y2);plot(t,y1,'b:',t,y2,'gx',t,y3,'ro');holdoff;axis([01001]);axis([010-11]);6.5.2分支结构6.5.2.1条件语句(if-else-end)共有五种调用格式:1)if逻辑表达式%if与后面的逻辑表达式之间必须至少要有一个空格语句体end2)if逻辑表达式语句体1else语句体2end3)if逻辑表达式1语句体1elseif逻辑表达式2语句体2end4)if逻辑表达式1语句体1elseif逻辑表达式2语句体2elseif逻辑表达式3语句体38……else语句体nend5)if逻辑表达式1语句体1if逻辑表达式2语句体2else语句体3end……else语句体nend例:设有一分段函数4422sin2032022xexxxxxxfx,试编写函数程序和调用程序,求其函数值。程序文件fun1.m文件:functiony=fun1(x)%UNTITLED1Summaryofthisfunctiongoeshere%Detailedexplanationgoeshereifx0y=x^2;elseifx=0&x=2y=2-3*x;elseifx2&x4y=sin(2*x);elseifx=4y=exp(2*x);end调用文件order1.m:x=2;y=fun1(2)x=0:0.1:2;y=fun1(x);9plot(x,y,'-r');【例6.5.2-1】clear;fname=input('inputFunctionname=');t=0:pi/50:2*pi;iffname=='sin'y=sin(t);elsefname=='exp'y=exp(t);endplot(t,y);【例6.5.2-2】clear;a=input('inputa=');t=0:pi/50:2*pi;ifa==1y=sin(t);elseifa==2y=sin(t).*exp(-t);elsey=cos(t).*sin(t);endplot(t,y);6.5.2.2开关语句(switch-case-end)调用格式:switch表达式case表达式值1语句体1case表达式值2语句体2……otherwise语句体nend10例:用键盘输入数字,输入数字“1”、“2”、“3”,分别计算函数y=sin(t)、y=sin(t)·e-t和y=t3,并绘制函数曲线。clear;a=input('inputa=');t=0:pi/50:2*pi;switchacase1y=sin(t);case2y=sin(t).*exp(-t);otherwisey=t.^3;endplot(t,y);6.5.3循环结构6.5.3.1for-end循环for循环语句一般用于循环次数已经确定的情况下。调用格式:forI=表达式1:表达式2:表达式3语句体end其中,I为循环变量,表达式1的值为循环变量的初值,表达式2的值为循环的步长,表达式3的值为循环变量终值。如果省略表达式2,则表示步长为1。【例6.5.3.1-1】fori=1:10y(i)=sin(i*pi/10);end【例6.5.3.1-2】i=1:10y=sin(i*pi/10);执行比【例6.3.1.1-1】更快、更直观、输入数据更少。【例6.5.3.1-3】fori=10:-1:111y(i)=iend【例6.5.3.1-4】fori=1:3forj=1:3a(i,j)=i+j;endend6.5.3.