《m文件与程序设计讲义(精品)》由会员分享,可在线阅读,更多相关《m文件与程序设计讲义(精品)(39页珍藏版)》请在金锄头文库上搜索。
1、M文件与程序设计,2,2018/10/23,用MATLAB语言编写的程序,称为M文件。 M文件有两种形式 :脚本文件(Script File)函数文件(Function File )这两种文件的扩展名,均为“ . m” 。,1.6 M文件,3,2018/10/23,脚本文件和函数文件,1、 M脚本文件(Script File) 实际上是一串MATLAB指令集合。,对于比较简单的问题 ,在命令窗口中直接输入指令 。,对于复杂计算,采用脚本文件(Script file)最为合适 。,MATLAB只是按文件所写的指令执行。 与在命令窗口逐行执行文件中的所有指令,其结果是一 样的。 没有输入参数,也不
2、返回输出参数。,4,2018/10/23,例:建立一个脚本文件(命令文件)将a,b的值互换,然后运行该m文件。,1、 新建m文件,并以m1.m保存 clear a=1,2,3, b=4,5,6 c=a; a=b; b=c; a b2、在MATLAB的命令窗口中输入m1,将会执行该命令文件。,5,2018/10/23,M脚本文件的特点:,脚本文件的构成比较简单,只是一串按用户意图排列而成的(包括控制流向指令在内的)MATLAB指令集。,脚本文件运行后 ,所产生的变量都驻留在 MATLAB基本工作空间(Base workspace)中。只要用户不使用清除指令(clear), MATLAB指令窗不关
3、闭,这些变量将一直保存在基本工作空间中。,6,2018/10/23,2、M函数文件(Function File ),与脚本文件不同 ,函数文件犹如一个“黑箱”,把一些数据送进并经加工处理,再把结果送出来。,MATLAB提供的函数指令大部分都是由函数文件定义的,例如 inv, abs和 sqrtY=abs(X),用户可以根据需要编辑自己的m函数,它们可以像库函数一样方便的调用,从而极大地扩展了matlab 的能力。可以输入参数,也可返回输出参数,7,2018/10/23,例:编写一个函数文件,实现直角坐标(x,y)与极坐 标(r,)之间的转换。,function r,theta = tran(x
4、,y)r =sqrt(x*x+y*y);theta =atan(y/x);,调用 tran函数 x=3;y=4; r,t=tran(x,y),tran.m,8,2018/10/23,M函数文件的特点:,从形式上看 ,与脚本文件不同 ,函数文件的笫一行 总是以 “function”引导的“函数申明行”。,从运行上看 ,与脚本文件运行不同 ,M函数中使用 的变量都是局部变量,即在该函数返回之后,这些变 量会自动在MATLAB的工作空间中清除掉。,9,2018/10/23,m函数文件必须由function作为引导词,必须遵循如下形式:function 输出形参表 = 函数名(输入形参表)%注释说明部
5、分函数体,1)m函数文件格式,10,2018/10/23,例:编写函数,求半径为r的圆的面积和周长 fcircle.m文件代码如下: function s, p= fcircle (r) % CIRCLE calculate the area and perimeter of a circle % of radial rs=pi*r*r;p=2*pi*r;,11,2018/10/23,规则和属性 1. 函数名和文件名必须相同。 2. 函数可以有零个或更多个输入参量,也可以有零个或更多个输出参量。当有一个以上输出变量时,输出变量包含在括号内。例如, V,D=eig(A) 3. 函数中的变量均为局
6、部变量,不保存在工作空间中。其变量只在函数运行期间有效。函数内变量与MATLAB工作空间之间唯一的联系是函数的参数。,12,2018/10/23,2)函数调用,函数调用的一般格式是:输出实参表=函数名(输入实参表),函数定义: function s, p= fcircle (r) % CIRCLE calculate the area and perimeter of a % circle of radial rs=pi*r*r;p=2*pi*r;,函数调用 area, l=fcircle(1),13,2018/10/23,函数调用可以嵌套,一个函数可以调用别的函数,甚至调用它自己 (递归调用
7、)。,14,2018/10/23,3)局部变量和全局变量,局部(Local)变量:它存在于函数空间内部的中间变量,产生于该函数的运行过程中,其影响范围也仅限于该函数本身 。,全局(Global)变量:通过 global 指令,MATLAB也允许几个不同的函数空间以及基本工作空间共享同一个变量,这种被共享的变量称为全局变量。,全局变量用global命令定义,格式为:global 变量名,15,2018/10/23,【例】 全局变量应用示例,先建立函数文件wadd.m,该函数将输入的参数加权相加。 function f=wadd(x,y)%add two variable global ALPHA
8、 BETAf=ALPHA*x+BETA*y;,在命令窗口中输入:global ALPHA BETAALPHA=1;BETA=2;s=wadd(1,2) 输出为:s =5,全局变量的作用域是整个MATLAB工作空间, 所有的函数都可以对它进行存取和修改。因此, 定义全局变量是函数间传递信息的一种手段。,16,2018/10/23,4 )函数所传递参数的可调性,MATLAB在函数调用上有一个与众不同之处:函数所传递参数数目的可调性。 凭借这一点,一个函数可完成多种功能。 linspace(d1,d2,n) linspace(d1,d2) E = EIG(X) V,D = EIG(X) 两个特殊变量
9、 nargin 所用函数的输入参量个数nargout 所用函数的输出参量个数,17,2018/10/23,【例】 nargin用法示例,函数文件examp.m:function f=examp(a,b,c)if nargin=1f=a;elseif nargin=2f=a+b;elseif nargin=3f=(a*b*c)/2;end,命令文件mydemo.m:x=1:3;y=1;2;3;examp(x)examp(x,y)examp(x,y,3),执行mydemo.m后的输出是:ans =1 2 3ans =2 4 6ans =21,18,2018/10/23,在调用函数时,MATLAB用
10、两个永久变量 nargin和nargout. 分别记录调用该函数时的输入 实参和输出实参的个数。只要在函数文件中包含 这两个变量,就可以准确地知道该函数文件被调 用时的输入输出参数个数,从而决定函数如何进 行处理。,19,2018/10/23,input函数:用于向计算机输入一个参数。 调用格式: A=input(提示信息,选项); 注:s选项,则允许用户输入一个字符串。 例如:想输入一个人的姓名,可采用命令xm=input(Whats your name:,s),1数据的输入输出,1.8、 程序设计,20,2018/10/23,【例】 求一元二次方程a2 +bx+c=0的根。,a=input
11、(a=?);b=input(b=?);c=input(c=?);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a) 将该程序以aa.m文件存盘,然后运行aa.m文件。,21,2018/10/23,pause函数:暂停程序的执行。 调用格式: pause(延迟秒数) 注:如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。,disp函数:命令窗口输出函数。 调用格式: disp(输出项) 注:输出项为字符串或矩阵。 例如:A=Hello,MATLAB;disp(A) 输出为: Hello,MATLAB,22,2018
12、/10/23,(一)选择结构,选择结构的语句有if语句和switch语句。 1 if语句格式一: if 条件语句组end,格式二: if 条件语句组1else语句组2end,23,2018/10/23,格式三: if 条件1语句组1elseif 条件2语句组2elseif 条件m语句组melse语句组m+1end,常见错误分析,24,2018/10/23,2. switch语句,switch语句根据变量或表达式的取值不同,分别 执行不同的语句。其格式为:switch 表达式case 值1语句组1case 值2语句组2case 值m语句组motherwise语句组m+1end,25,2018/1
13、0/23,例:键盘输入两个大小不等的数a, b。比较并显示它们的大小关系。,a=input(a=); b=input(b=); if abdisp(a b); else disp(ab); end,26,2018/10/23,程序段:,n=input(please input a number:); if n , =, = =, = 等 逻辑操作符 &,| , 等逻辑函数:isequal 若是相等则为真isempty 若是空矩阵则为真ischar 若是字符串则为真,29,2018/10/23,(二)循环结构,实现循环结构的语句:for语句和while语句。 1 for语句: 格式: for 循
14、环变量=表达式1:表达式2:表达式3循环体语句end 注:其中表达式1的值为循环变量的初值,表达式2的值为步长,步长为1时,可省略。表达式3的值为循环变量的终值。,30,2018/10/23,2 while语句 格式为:while 条件循环体语句end,31,2018/10/23,x(1)=1;for n = 2:6x(n) = 2 * x(n - 1); end,x =1 2 4 8 16 32,例:for语句构成的程序段,32,2018/10/23,例:利用for循环求1!+2!+3!+ +5!的值sum=0;for i=1:5sum=sum+prod(1:i);endsum,33,201
15、8/10/23,例:求向量x的各元素的平方和x = input (x=);s=0;for i=1:length(x)s=s+x(i)2;end s,34,2018/10/23,for 循环变量 = 矩阵表达式a= 1 2 3 ;5 6 7 ;9 10 11执行过程是依次将矩阵 的各列元素赋给循环变量,for i=ay=i(1)+i(2)+i(3);end,y = 15y = 18 y = 21,35,2018/10/23,For example, this while loop finds the first integer n for which n! (n factorial) is a 5-digit number. n = 1;while prod(1:n) 1e5n = n + 1;endbreak continue,