1、第六章 MATLAB的m文件和函数句柄, matlab语言称为第四代编程语言,程序简洁、可读性很强而且调试十分容易。 是matlab重要组成部分。,m文件简介,用户如想灵活应用matlab去解决实际问题,充分调用matlab的科学技术资源,就需要编辑m文件 包含matlab语言代码的文件称为m文件,其扩展名为m。 编辑m文件可使用各种文本编辑器。,一、matlab的工作模式,指令驱动模式 通常matlab以指令驱动模式工作,即在matlab 窗口下当用户输入单行指令时,matlab 立即处理这条指令,并显示结果,这就是matlab命令行方式。 命令行操作时,matlab窗口只允许一次执行一行上
2、的一个或几个语句。,x1=0:10,x2=0:3:11,x3=11.5:-3:0 x1 =0 1 2 3 4 5 6 7 8 9 10 x2 =0 3 6 9 x3 =11.5000 8.5000 5.5000 2.5000 在matlab窗口输入数据和命令进行计算时,当处理复杂问题和大量数据时是不方便的。因此应编辑m文件。,命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件。 m文件模式 将matlab语句构成的程序存储成以m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。 程序文件不能在指令窗口下建立,因为指令窗口只允许一次执行一行上的一个或
3、几个语句。,二、m文件的创建,m文件的类型是普通的文本文件,我们可以使用系统认可的文本文件编辑器来建立m文件。如dos下的edit,windows的记事本和word等。 具体的创建方法: 在matlab命令窗口点击file 菜单new m-file,编辑,存储,2. 点击file Save Workspace As,将工作空间中的内容存入文件。 3. !edit 用dos 下edit 编辑器编制m文件。 4. edit 用matlab自带的编辑器编制m文件。m文件编辑器的设定m文件编辑器可自己设定,设定方法是matlab命令窗口 options 菜单下点击 Edit Preference选定m
4、文件编辑器。,m文件编辑器缺省设置是c:windowsnotepad.exe还可设成:c:windowswrite.exec:c:program fileofficewinword.exe注意:所创建的m文件必须纳入matlab搜索路径后,才能在matlab命令窗口运行。,三、matlab文件的类型,数据文件 .matmat文件是matlab以标准二进制格式保存的数据文件,可将工作空间中有用的数据变量保存下来。mat文件的生成和调用是由函数save和load完成的。,2. m文件m文件的语法类似于c语言,但又有其自身特点。它只是一个简单的ASCII码文本文件,执行程序时逐行解释运行程序,mat
5、lab是解释性的编程语言。m文件有两类独立的m文件 称命令文件可调用m文件 称函数文件 (1). 命令文件 简单的m文件命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。,命令文件包括两部分:注释文件和程序文件 %RANK Number of linearly independent rows or columns. % K = RANK(X) is the number of singular values of X % that are larger than MAX(SIZE(X) * NORM(X) * EPS. % K = RAN
6、K(X,tol) is the number of singular values of X that % are larger than tol.% Copyright (c) 1984-94 by The MathWorks, Inc. %奇异值分解 s = svd(x); if (nargin = 1)tol = max(size(x) * max(s) * eps; end r = sum(s tol);,程序部分,(2).matlab内置函数文件matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数用type si
7、n查不到。调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*pi;y=sin(2*x)plot(x,y),(3). 函数m文件 需要输入变量,返回输出变量matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab 的能力。,函数m文件的格式:function 返回变量=函数名(输入变量)注释说明语句段程序语句段 特定规则: 函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:function =() m文件的文件名必须是 .m。 程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效。,
8、function Hr=exm060301(flag ) % t=(0:50)/50*2*pi; x=sin(t); y=cos(t); Hr=cirline; % feval(Hr,flag,x,y,t) % function cirline(wd,x,y,t) % switch wd case lineplot(t, x, b ,t , y, r, LineWidth, 2) case circleplot(x, y, -g, LineWidth, 8),axis square off otherwiseerror(输入宗量只能取 line 或 circle ! ) end shg,HH=
9、exm060301(circle),t=0:2*pi/5:2*pi;x=cos(t);y=sin(t); %HH(circle,x,y,t) %,P码文件 pcode expcode.m %当前目录 pcode expcode.m inplace %能找到的目录,(4). 系统文件s函数用于描述系统运动的专用函数,是特殊的 m 文件。s 函数有3类: 由simulink结构图自动创建 可用c语言程序设计mex文件直接定义 用函数m文件编写s函数一旦创建,即可在框图中使用,也可在文件中调用。,S函数的调用格式sys, x0=sfunction( t, x, u, flag)S函数与函数m文件类似
10、,只是输入、输出变量是限定的。,(5). 函数句柄函数句柄优点: 方便地实现函数间互相调用 兼容函数加载的所有方式 拓宽子函数包括局部函数的使用范围 提高函数调用的可靠性 减少程序设计中的冗余 提高重复执行的效率 数组、结构数组、细胞型数组结合定义数据,函数句柄的创建和显示定义函数句柄的定义只需在提示符后添加相应函数的函数名f_h=plot f_h = plot函数句柄的内容通过functions显示functions(f_h) ans = function: plottype: overloadedfile: MATLAB built-in functionmethods: 1x1 stru
11、ct,matlab的函数类型simple 未加载的内部函数.m文件overloaded 加载的内部函数.m文件subfunction 子函数 constructor matlab类的创建函数private 局部函数,函数句柄的调用和操作可通过函数feval进行函数句柄的调用feval(函数句柄)f_h1=peaksfeval(f_h1)feval(函数句柄,参数列表)f_h=plotfeval(f_h,0:10,0:10),函数句柄与函数名字符串转换func2str 函数名字符串转换函数句柄str2func 函数句柄转换函数名字符串funh=str2func(det)ans=funh = de
12、tfunc2str(funh)ans =det,四、matlab的程序结构,matlab语言的程序结构与其它高级语言是一致的,分为顺序结构,循环结构,分支结构。(1).顺序结构 依次顺序执行程序的各条语句,(2).循环结构 被重复执行的一组语句,循环是计算机解决问题的主要手段。循环语句主要有: for end,语法为:for i = 表达式 (表达式为一个向量)可执行语句end 例:利用for循环求1!+2!+3!+ +5!的值sum=0;for i=1:5pdr=1;for k=1:ipdr=pdr*k;endsum=sum+pdr;end,sum =153, while end 循环whi
13、le循环将循环体中的语句循环执行不定次数。语法为:while 表达式循环体语句end表达式一般是由逻辑运算和关系运算以及一般运算组成的,以判断循环的进行和停止;只要表达式的值 非0,继续循环;直到表达式值为0,循环停止。,例:用while循环求1100间整数的和sum=0;i=1;while i=100sum=sum+i;i=i+1;endsumsum = 5050,(3)分支结构根据一定条件来执行的各条语句 if else end语句有3种形式 if 表达式执行语句end if 表达式 是语句1else 否语句2end, if 表达式1 多分支语句1elseif 表达式2 语句2elseif
14、 表达式3语句3 else语句nend,这种结构实现了一种多路选择,比较复杂。可替代一般高级语言中的switch-case-end语句,在条件表达式中,通常都是由关系操作符 , =, = =, = 等 逻辑操作符 &,| , 等逻辑函数:isequal 若是相等则为真isempty 若是空矩阵则为真isstr 若是字符串则为真xor 一真一假返回真all 全为真、全非0则为真any 只要有1个非0则为真,例:编写m函数,计算函数值x (x=10),x=input(input x=); if x=10y=3*x-11 else y=2*x-1 end,function exm0701_2(a ,
15、 b) % This is my second example. % a Define the limit of variable x . % b Define the limit of variable y .clf; x=-a:0.2:a;y=-b:0.2:b; for i=1:length(y)for j=1:length(x)if x(j)+y(i)1z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2-1.5*x(j);elseif x(j)+y(i)=-1z(i,j)=0.5457*exp(-0.75*y(i)2-3.75*x(j)2+1.5*x(j);
16、else z(i,j)=0.7575*exp(-y(i)2-6.*x(j)2);endend end axis(-a,a,-b,b,min(min(z),max(max(z); colormap(flipud(winter); surf(x,y,z); shg,swtich 表达式(标量或字符串)case 1语句1 case 2语句2 otherwise end,%exswt1 x=input(x=) switch x case 2disp(上机实习) case 1disp(听课) otherwisedisp(no matlab) end,try 命令 1 %总执行,正确跳出结构 catch
17、命令 2 %检1错执行catch end %再错结束,clear,N=4;A=magic(3);%设置3行3列矩阵A。 tryA_N=A(N,:), %取A的第N行元素 catchA_end=A(end,:), %如果取A(N,:)出错,则改取A的最后一行。 end lasterr %显示出错原因,五、matlab程序流的控制,matlab的控制语句同c语言有相似之处, 但没有c 语言复杂、灵活和多变。因而语法比较简单,容易掌握。 echo 指令 用来控制m文件在执行过程中是否显示echo on 打开所有命令文件的显示方式echo off 关闭所有命令文件的显示方式echo 在以上两者间切换,
18、echo对于命令文件函数文件有所不同,命令文件用法简单,函数对所有命令起作用;函数文件用法较复杂,具体请help查询。echo file on 打开file函数文件的显示方式echo file off 关闭file函数文件的显示方式echo file 切换file函数文件的显示方式echo on all 打开所有函数文件的显示方式echo off all 关闭所有函数文件的显示方式,return 被调函数终止执行并交执行权于调用函数,input 提示用户从键盘输入数值、字符串、表达式。例:n=input(How many apples= ) How many apples= 5 n =5 n=
19、input(How many apples=,s) How many apples= an apple n = an apple,keyboard 与input类似,功能更强keyboard 调用键盘与调用m文件一样,当keyboard在m文件中出现时,它停止文件的执行并控制键盘,用于修改程序。 menu 产生一个用户可选择输入的菜单格式:k=menu( 标题,菜单1,菜单2 ),pause 暂停,等待用户响应可令m文件执行暂停,并在继续执行前按任一个键 。 break 中断break 中断for, while循环语句的执行,在嵌套循环结构中, break进入最里层循环退出。,error wa
20、rning,变长度输入输出宗量 varargin varargout,Z = PEAKS;Z = PEAKS(N);Z = PEAKS(V);Z = PEAKS(X,Y);PEAKS;PEAKS(N);PEAKS(V);PEAKS(X,Y);X,Y,Z = PEAKS;X,Y,Z = PEAKS(N);X,Y,Z = PEAKS(V);,局部变量(local)全局变量(global)不提倡使用(不利函数封装),程序调试 直接调试:分号去掉;echo显示;keyboard查询;m函数文件放开;debug调试: 高手常用,function nn,xx,xmu,xstd=exmdebug(x) %
21、xmu=mean(x); xstd=std(x); nn,xx=hist(x); if nargout=0barzzy0(nn,xx,xmu,xstd) % end,function barzzy0(nn,xx,xmu,xstd) % clf, bar(xx,nn);hold on Ylimit=get(gca,YLim); yy=0:Ylimit(2); % xxmu=xmu*ones(size(yy); xxmu=xmu*size(yy); xxL=xxmu/xmu*(xmu-xstd); xxR=xxmu/xmu*(xmu+xstd); plot(xxmu,yy,r,Linewidth,
22、3) % plot(xxL,yy,rx,MarkerSize,8) plot(xxR,yy,rx,MarkerSize,8),hold off,randn(seed,1);x=randn(1,100); exmdebug(x),xxmu=xmu*ones(size(yy),六、文件操作,matlab文件输入、输出(I/O)函数允许把其它格式的数据文件直接读进matlab,它是以c语言文件I/O函数为基础的。 打开和关闭文件(fopen, fclose)格式:fid=fopen(数据文件,r)r 读w 写a 附加r+ 读写,文件一旦打开,即可进行读写操作。sta=fclose(fid) 关闭上述
23、打开文件sta=fclose(all) 关闭所有打开的文件 与save,load类似,是matlab专用数据文件读写工具(*.mat)。 2. 读写二进制数据文件fread, fwrite 可读写数据文件,文本文件。 例:fid=fopen(user.dat,r)a=fread(fid,50)sta=fclose(fid),strcount(poem,an) 查找字符串 函数:fgetl fgets(不包括换行符),读取有格式文件,strcount.mfunction y=strcount(filename,str) %寻找指定字符串在文件中出现的次数 fid=fopen(filename,r
24、t); y=0;while feof(fid)=0line=fgetl(fid);matches=findstr(line,str);num=length(matches);if num0y=y+num;fprintf(1,%d:%sn,num,line);endend fclose(fid),fil.txt Oranges and les, Orangutans and monkeys, Dragon or fleas.,fscanf 不用循环,自动完成%s 字符串 %d 十进制 %g双精度浮点 % exfscanf1.m fid=fopen(test.dat,r); mydata=fsca
25、nf(fid,%g); pause,fseek(fid,0,bof) %指针返回 mydata33=fscanf(fid,%g,3,3); pause,fseek(fid,0,bof) %指针返回 mydata43=fscanf(fid,%g,4,3); f=fclose(fid);,%exfscanf.mfid=fopen(magic1.dat,r); mydata=fscanf(fid,%g); f=fclose(fid) fid=fopen(magic1.dat,r); mydata,count=fscanf(fid,%g,3 3); f=fclose(fid),fprintf 写入文本
26、文件,不用循环,自动完成%s 字符串 %d 十进制 %g双精度浮点 sprintf 写入字符串 exsprintf,写入有格式文件,x=1:5;y=x;x.2; fid=fopen(st.dat,w); t=fprintf(fid,Square Function nn); c=fprintf(fid,%5d %5dn,y) fclose(fid),sprintf 写入字符串,rt=sprintf(The square root of %f is %d10.8e.n,2,sqrt(2),七、应用程序接口,应用程序接口是matlaab的附加组件。是一个 由相关函数组成的接口函数库,可实现与外部程
27、序的交互。 MEX文件:是matlab环境下调用C、FORTRAN语言编写的应用程序模块。 matlab 计算引擎:在使用C、FORTRAN编程时可调用matlab函数库进行计算。 MAT文件:实现matlab与C、FORTRAN语言程序间的数据交换,八、matlab编译,matlab编译的原因: 1. 提高运算速度 2. 隐藏特定算法 3. 可产生独立的m文件 matlab编译函数:mccmcc -x *.m circle_f.m 观察产生的新文件,MATLAB编译器对MATLAB产生了新的期望:一 希望程序能运行得更快;二 希望获得可摆脱MATLAB环境而独立运行的可执行软件。,编译器的功
28、能,编译器的局限性,MCC,MCC 几种调用格式,MCC 几种调用格式,编译器宏选项功能一览表,Matlab编程巩固篇,函数的定义及申明- 使用方式: 调用/嵌套 - 协作方式: 主函数/子函数/嵌套函数- 内部变量: 生存周期控制控制语句- if /if-else/if-elseif-else- switch-case- for/while,if 语句一般形式 if logical_expressionblock of statementselseif logical_expressionblock of statements elseblock of statementsend,例 输入三
29、角形的三条边,求面积。,A=input(请输入三角形的三条边:);if A(1)+A(2)A(3) elsedisp(不能构成一个三角形。)end 运行: 请输入三角形的三条边:4 5 69.9216,选择结构,【例】 输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,若为其他字符则原样输出。,c=input(,s);if c=A end,switch 语句 一般形式switch expressioncase value1,block of statementscase value2,block of statements.otherwise,block of st
30、atementsend,【例】 根据变量 num 的值来决定显示的内容。,num=input(请输入一个数);switch numcase -1disp(I am a teacher.);case 0disp(I am a student.);case 1disp(You are a teacher.);otherwisedisp(You are a student.);end,- 循环结构 根据条件重复执行程序指令或模块for 语句 % 计数循环一般形式for index = expressionblock of statementsend,while 语句 一般形式while expres
31、sionblock of statementsend,循环的嵌套,如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。 多重循环的嵌套层数可以是任意的。可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部的循环叫作内循环,处于外部的循环叫作外循环。,【例】 求100,1000以内的全部素数。,n=0;for m=100:1000flag=1; j=m-1;i=2;while i=j end,i=i+1;endif flag n=n+1;prime(n)=m;endendprime %变量prime存放素数,循环中断控制: while 语句实例x = rand(
32、1,10);k = 1;while k0.8breakendk = k + 1;end,函数返回控制: while 语句实例x = rand(1,10);k = 1;while k0.8returnendk = k + 1;end,plot(t,y(:,1),t,y(:,2),-,t,y(:,3),.-,t1 t1,-100 100,k:);datetick(x,dd/mm,keeplimits);axis tight;title(mybirthday);legend(Physical,Emotional,Intellectual);xlabel(timedd/mm);ylabel(biory
33、thm index %),用户参数交互输入参数的作用: 使程序更加通用灵活参数输入的主要模式 - input 函数输入参数- keyboard函数 (键盘模式)- menu 函数 (菜单模式),键盘输入模式基本格式: v= input( 显示的提示信息 );功能实现: 向用户显示提示信息将用户的输入赋给v 使用实例freq=input(frequence is) 结果frequence is (等待键盘输入,回车确认输入完成 ),键盘控制模式基本格式: keyboard;功能实现: 临时终止程序执行将控制权交给命令窗口利用回车结束键盘控制 使用实例查询/修改函数工作空间的变量 建立新的函数空间
34、的变量,菜单输入模式基本格式: item_no=menu(title,item1,itemn);功能实现: 显示菜单用户选择按钮返回菜单序号 使用实例s=menu(signal,red,green,yellow) 可结合选择控制语句使用,循环向量化计算模式目的: 向量计算替代循环模式实例: tic ticfor t=0:0.01:100 t=0.0:0.01:100i=i+1; y(i)=sin(t) y=sin(t)end toctoc 耗时7.58 耗时0.01,内存使用/管理目的: 提高内存使用效率主要的命令 clear % 清楚变量 pack % 将变量寄宿在磁盘 quit % 退出M
35、atlab环境 save % 将变量数据存入文件 load % 将文件数据加载进入工作空间,【例】 利用函数文件,实现直角坐标(x,y)与极坐标(,)之间的转换。,函数文件tran.m:function gama,theta=tran(x,y)gama=sqrt(x*x+y*y);theta=atan(y/x);调用tran.m的命令文件main1.m:x=input(Please input x=:);y=input(Please input y=:);gam,the=tran(x,y);gamthe,已知转换公式为:极坐标的矢径:=极坐标的幅角:=,函数文件,在MATLAB中,全局变量用命
36、令global定义。函数文件的内部变量是局部的,与其他函数文件及MATLAB工作空间相互隔离。但是,如果在若干函数中,都把某一变量定义为全局变量,那么这些函数将公用这一个变量。全局变量的作用域是整个MATLAB工作空间,即全程有效。所有的函数都可以对它进行存取和修改。因此,定义全局变量是函数间传递信息的一种手段。,函数文件,【例】 全局变量应用示例,先建立函数文件wadd.m,该函数将输入的参数加权相加。 function f=wadd(x,y)%add two variable global ALPHA BETAf=ALPHA*x+BETA*y;,在命令窗口中输入:global ALPHA BETAALPHA=1;BETA=2;s=wadd(1,2) 输出为:s =5,Matlab程序调试主要工具: m编辑器内嵌debugger功能程序错误 语法或格式错误: 显式且容易定位功能或计算错误: 算法错误纠错技巧 显示中间变量的内容利用Keyboard语句,查看函数工作空间的变量内容 设置断点或单步执行方式,小 结,本节主要介绍了matlab语言程序设计基础。matlab 编程简单,容易掌握。通过学习,应能编写简单程序,结 束 语,本课程基于matlab语言基础,望大家以后进一步学习,方能编写出高质量m文件,以适应高科技的需要。 望你们今后能成为matlab高手。,