第7章_M文件和函数句柄
- 格式:doc
- 大小:92.50 KB
- 文档页数:10
目录:一、说明二、数据类型及基本输入输出三、流程控制四、循环五、数组、数组运算和矩阵运算六、M脚本文件和M函数文件、函数句柄七、文件八、数据和函数的可视化一、说明看了奚啸翔同学写的Fortran基本用法小结后觉得Fortran的语法既有matlab 的特色也有C的特色。
于是就套用了奚啸翔同学文章的格式,写了这篇matlab基本用法小结。
目的是想和Fortran的语法有个对比,学起来更快。
其实学过C、Fortran和matlab中任何一个的同学要学其他两种语言的语法都是非常容易上手的,一天就能搞定了。
有兴趣的同学还可以看看百合Fortran版上的C、Fortran、matlab语法对比,一定能有不少收获。
此外,尽管这三种语言的语法有很多相近的地方,matlab作为数学软件有其强大的图形用户界面操作、数据和函数的可视化和数值计算功能,且自带很多现有的函数和工具包。
而本文只涉及一些比较系统的基本操作,在最后附带介绍一些基本的数据和函数的可视化命令。
建议要用的时候再利用matlab自带的帮助文档来搜索有用的函数和工具包。
matlab的函数和命令都是比较人性化的,比如想要搜索读取fits文件的函数,搜索fits 就能够搜到fitsread函数;需要将读出的fits数据重新做图,搜索image就可以找到imagesc函数。
从书和别人的文档都只能学到有限的比较系统的操作,看帮助文档能发现更多的东西并整理出自己的使用方法。
最后要说明的是,C必须用循环才能做到的事情Fortran和matlab用矩阵和数组运算就能做到,相对效率提高了很多;而对于一些运算量非常大的程序还是推荐用Fortran,因为相比之下matlab的运算速度比Fortran慢很多;而网上很多现有的天文软件包都是用fortran写的(比如由宇宙学参数计算模拟数据的CAMB程序和宇宙模型可能性预测LIKELIHOOD程序),虽然matlab也有很多天文软件包,但相对fortran还是逊色不少。
原文地址:(Matlab基本知识----连载之六)M脚本文件和M函数文件、函数句柄(转,介绍的不错)m文件分两种:函数和脚本。
1、matlab script file:脚本文件没有输入输出,对工作空间(workspace)中的变量进行操作。
任何可执行的matlab命令都可以写入脚本文件。
先来看一个简单的例子:例1: 产生一个20元素的一维随机数组并画出。
解: 新建一个m文件命名为randplt.m(或者任何你喜欢的名字), 在其中加入如下两行代码:data=randn(1,20);plot(data);保存后选择debug/run菜单或按F5键运行,观察workspace中多出了一个变量data。
脚本文件执行时, 就如同将文件中的每一条命令依次输入到matlab命令行中一样, 顺次执行。
你可以尝试在command history窗口中按住ctrl键选择几行执行过的命令并单击鼠标右键在快捷菜单中选择creat M file来快速创建一个m文件。
2、matlab function函数文件可以接受输入和给出输出,当然也可以没有,就像c语言的函数。
matlab 函数最大的书写特点(同C比起来)是它的输出变量定义在函数名前面。
看一例: 例2: matlab内部函数std给出数组的标准差std=sqrt(sum(X)/N),编写函数stderr求实验误差 err=sqrt(sum(X)/(N*(N-1))), 代码如下:function err=stderr(arr)%实验误差(标准差估计)evaluate along each column of arrerr=std(arr)./sqrt(size(arr,1)-1);文件存为stderr.m, 运行时输入a=[1;2;3];建立一个列数组a, 然后输入stderr(a)则给出a的方差。
(若输入行数组则发散,因N-1=0)此例中输入变量为arr,函数名为stderr, 输出变量err, 此三者皆写在关键字function后面同一行。
第一套华东交通大学2015-2016学年第一学期Matlab期末考试一、填空题(4*6=24分)1、在MATLAB命令窗口中的“>>”标志为MATLAB的命令行提示符,“│”标志为输入提示符。
2、符号表达式sin(2*a+t)+m 中独立的符号变量为_t_。
3、在通常情况下,左除x=a\b是的解,右除x=b/a是的解,一般情况下,。
4、为了使两个plot的图形在同一个坐标显示,可以使用___hold on__命令进行图形保持;可以使用_ grid on__命令为图形添加网格。
5、倘若要是对x进行赋值,从5到25,间隔是0.1,为x=5:0.1:25 ;倘若要是对x进行赋值,从2到20,中间间隔100个点,为x=linspace(2,20,100)6、A=[1,2;3,4];B=[1,0;0,1]; A*B= [1 2;3 4] _ , A.*B=_ [1 0;0 4] _;3. a*x=b , x*a=b , a\b ,b/a;二、选择题(4*6=24分)7、如果x=1: 2 : 8,则x(1)和x(4)分别是( B )A.1,8 B.1, 7 C.2, 8 D.2, 78、运行如下程序后,输入9回车,命令窗口(command windows)显示的结果为( A)c=input('请输入一个字符','s');if c>='A' & c<='Z'disp(setstr(abs(c)+abs('a')-abs('A')));elseif c>='a'& c<='z'disp(setstr(abs(c)- abs('a')+abs('A')));elseif c>='0'& c<='9'disp(abs(c)-abs('0'));else disp(c); endA. 9B. 8C. 7D. 69、MATLAB表达式2*2^3^2的结果是( A )A.128 B.4096 C. 262144 D.25610、在循环结构中跳出循环,执行循环后面代码的命令为(B)(A) return (B) break (C) continue (D) keyboard11、在图形指定位置加标注命令是(C)A. title(x,y,‟y=sin(x)‟);B. xlabel(x,y,‟y=sin(x)‟);C. text(x,y,‟y=sin(x)‟);D. legend(x,y,‟y=sin(x)‟);12、下列哪个变量的定义是不合法的(A)。
matlab课件-M函数⽂件第 6 章 M ⽂件和函数句柄MATLAB 程序可以由较多的MATLAB 指令和多种多样的MATLAB 表达式组成,并循着⼀定的执⾏次序运⾏。
这种程序的扩展名为m ,这就是脚本M ⽂件或函数M ⽂件。
本章系统介绍编写MATLAB 程序时最常⽤到的四种控制结构、M 函数⽂件的构造、主函数、⼦函数以及匿名函数。
最后⼀节专门叙述函数句柄的创建、观察和调⽤。
6.1 MATLAB 控制流作为⼀种计算机编程语⾔,MATLAB 提供了多种⽤于程序流控制的描述关键词(Keyword )。
本节只介绍其中最常⽤的条件控制(if, switch )和循环控制(for, while, continue, break )。
MATLAB 的这些指令与其它语⾔相应指令的⽤法⼗分相似,因此本节只结合MATLAB 给定的描述关键词,对这四种指令进⾏简要的说明。
6.1.1if-else-end 条件控制if-else-end 指令为程序流提供了⼀种分⽀控制,它最常见的使⽤⽅式见表6.1-1。
【例6.1-1】已知函数xx x e xxy x ≤<≤--=+-111113,编写能对任意⼀组输⼊x 值求相应y 值的程序。
(1)function y=exm060101(x)% y=exm060101(x) Function calculate of example 6.1-1n=length(x); for k=1:n if x(k)<-1 y(k)=x(k); elseif x(k)>=1y(k)=exp(1-x(k)); elsey(k)=x(k)^3;endend(2)⽤exm060101命名M程序并存放在当前⽬录下x=[-2,-1.2,-0.4,0.8,1,6]y=exm060101(x)x =-2.0000 -1.2000 -0.4000 0.8000 1.0000 6.0000y =-2.0000 -1.2000 -0.0640 0.5120 1.0000 0.00676.1.2switch-case控制结构【例6.1-2】已知学⽣的名字和百分制分数。
实验十M文件及函数文件一、实验目的1. 学习M脚本文件和M函数文件的特征及创建方式2. 学习子函数、匿名函数的定义及使用3. 学习函数句柄的创建及使用二、实验原理1. M脚本文件在MATLAB的Desktop工作桌面上操作菜单File-New-M File,即打开M文件编辑器,此时默认新建一个以Untitled开头的M脚本文件,编写文件内容(由一串按用户意图排列的MATLAB指令集合),保存时可重新设定文件名。
脚本文件运行后,产生的指令驻留在MATLAB基本工作空间。
2. 函数文件如同一个“黑箱”,从外界只看到传给它的输入量和输出结果,内部运作藏而不见。
函数文件与脚本文件创建方式类似,但函数文件的第一行总是以function引导的函数申明行,且函数名与文件名保持一致。
函数文件运行时,MATLAB为其开辟专门的临时工作空间,称为函数工作空间。
中间变了存放于函数工作空间。
函数文件执行完后,函数工作空间及其中变了被清除。
3. 函数类别在MATLAB中函数可以分为主函数、子函数、嵌套函数、私用函数、匿名函数等,其中主函数、子函数和匿名函数最为常用。
这三类函数的区别如下:主函数实质上就是函数文件中由第一个function引出的函数,函数名与函数文件名一致。
在当前目录、搜索路径上会列出该函数所在的函数文件名。
在指令窗或视野包含该函数文件的其他文件中可调用并执行该函数。
采用help functionname可获得该函数携带的帮助信息。
子函数书写方式与主函数相同,但它必须是寄生在主函数中,在函数文件中由非第一个function引出,只能在其所在主函数及同一个函数文件中的其他子函数调用。
主函数与子函数工作空间彼此独立。
采用help functionname/subfunctionname可获取自函数所带的帮助信息。
匿名函数不以文件形式驻留在文件夹上,而是直接在指令窗或任何函数体内通过指令直接生成,适合于简单的函数。
第七章 M 文件和函数句柄7.1M 文本编辑器 7.2MATLAB 控制流 7.2.1 for 循环结构【例7.2-1】一个简单的for 循环示例。
for ii=1:10;x(ii)=ii;end;xx =1 2 3 4 5 6 7 8 9 107.2.2 while 循环结构【例7.2-2】Fibonacci 数组的元素满足Fibonacci 规则:12+++=k k k a a a ,),2,1( =k ;且121==a a 。
现要求该数组中第一个大于10000的元素。
a(1)=1;a(2)=1;i=2;while a(i)<=10000a(i+1)=a(i-1)+a(i);i=i+1;end;i,a(i),i =21ans =109467.2.3 if-else-end 分支结构【例7.2-3】一个简单的分支结构。
cost=10;number=12;if number>8sums=number*0.95*cost;end,sumssums =114.0000【例7.2-4】用for 循环指令来寻求Fibonacc 数组中第一个大于10000的元素。
n=100;a=ones(1,n);for i=3:na(i)=a(i-1)+a(i-2);if a(i)>=10000a(i),break;end;end,ians =10946i =217.2.4switch-case结构【例7.2-5】学生的成绩管理,用来演示switch结构的应用。
clear;for i=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];Name={' Jack','Marry','Peter',' Rose',' Tom'};Mark={72,83,56,94,100};Rank=cell(1,5);S=struct('Name',Name,'Marks',Mark,'Rank',Rank);for i=1:5switch S(i).Markscase 100S(i).Rank='满分';case aS(i).Rank=' 优秀';case bS(i).Rank=' 良好';case cS(i).Rank=' 及格';otherwiseS(i).Rank='不及格';endenddisp(['学生姓名 ',' 得分 ',' 等级']);disp(' ')for i=1:5;disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]); end;学生姓名得分等级Jack 72 及格Marry 83 良好Peter 56 不及格Rose 94 优秀Tom 100 满分7.2.5try-catch结构【例7.2-6】try-catch结构应用实例。
clear,N=4;A=magic(3);tryA_N=A(N,:),catchA_end=A(end,:),endlasterrA_end =4 9 2ans =Index exceeds matrix dimensions.7.2.6控制程序流的其它常用指令7.3脚本文件和函数文件7.3.1M脚本文件7.3.2M函数文件7.3.3局部变量和全局变量7.3.4M文件的一般结构【例7.3-1】M函数文件示例。
[circle.m]function sa = circle(r,s)%CIRCLE plot a circle of radii r in the line specified by s. % r 指定半径的数值% s 指定线色的字符串% sa 圆面积%% circle(r) 利用蓝实线画半径为 r 的圆周线.% circle(r,s) 利用串 s 指定的线色画半径为 r 的圆周线.% sa=circle(r) 计算圆面积,并画半径为 r 的蓝色圆面.% sa=circle(r,s) 计算圆面积,并画半径为 r 的 s 色圆面.% 编写于1999年4月7日,修改于1999年8月27日。
if nargin>2error('输入宗量太多。
');end;if nargin==1s='b';end;clf;t=0:pi/100:2*pi;x=r*exp(i*t);if nargout==0plot(x,s);elsesa=pi*r*r;fill(real(x),imag(x),s)endaxis('square')7.3.5P码文件一语法分析过程和伪代码二P码文件的预生成三内存中P码文件的列表和清除7.3.6MATLAB的搜索过程7.4变量的检测传递和限权使用函数7.4.1输入输出宗量检测指令7.4.2跨空间变量传递一跨空间计算串表达式的值【例7.4-1】evalin运行机理与eval的异同。
(1)编写M函数文件[evalinzzy.m]function y1=evalinzzy(a,s)t=(0:a)/a*2*pi;y1=subevalinzzy(4,s);%------------ subfunction -------------function y2=subevalinzzy(a,s)t=(0:a)/a*2*pi;ss='a*exp(i*t)';switch scase {'base','caller'}y2=evalin(s,ss);case 'self'y2=eval(ss);end(2)在Notebook或MATLAB指令窗中运行以下指令clear,a=30;t=(0:a)/a*2*pi;sss={'base','caller','self'};for k=1:3y0=evalinzzy(8,sss{k});subplot(1,3,k)plot(real(y0),imag(y0),'r','LineWidth',3),axis square image end图二跨空间赋值【例7.4-2】assignin运作机理示范。
(1)编写M函数文件[assigninxyq.m]function y=assigninxyq(x)y=sqrt(x);t=x^2;assignin('base','yy',t)(2)在Notebbok 或MATLAB指令窗中运行以下指令clear;x=4;y=assigninxyq(x);disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']),disp([x,y,yy]) x y yy4 2 167.4.3子函数和私用函数一子函数二私用函数7.5串演算函数7.5.1eval【例7.5-1】计算“语句”串,创建变量。
clear,t=pi;eval('theta=t/2,y=sin(theta)');theta =1.5708y =1【例7.5-2】计算“合成”串。
CEM={'cos','sin','tan'};for k=1:3theta=pi*k/12;y(1,k)=eval([CEM{k},'(',num2str(theta),')']);endyy =0.9659 0.5000 1.00007.5.2feval【例7.5-3】对字符串类型函数只能用eval ,而不能用feval。
x=pi/4;Ve=eval('1+sin(x)')Ve =1.7071Vf=feval('1+sin(x)',x)??? Error using ==> fevalInvalid function name '1+sin(x)'.【例7.5-4】函数句柄只能被feval 运用,而不能被eval 调用。
(1)rand('seed',1);A=rand(2,2);Heig=@eig;d=feval(Heig,A)d =0.7568-0.1488(2)de=eval(Heig,A)??? Error using ==> evalFunction 'eval' not defined for variables of class 'function_handle'.(3)dn=feval('eig', A)dn =0.7568-0.14887.5.3 内联函数【例7.5-5】用内联函数对象实现y ae y x a G x cos ),,( 。
G=inline('a*exp(x)*cos(y)','a','x','y');disp([class(G),blanks(10),char(G)])argnames(G)inline a*exp(x)*cos(y)ans ='a''x''y'GG=vectorize(G)GG =Inline function:GG(a,x,y) = a.*exp(x).*cos(y)GG(2,[1,2],[pi/3,pi])ans =2.7183 -14.7781【例7.5-6】演示:最简练格式创建内联函数;内联函数可被feval 指令调用。
Z2=inline('P1*x*sin(x^2+P2)',2)Z2 =Inline function:Z2(x,P1,P2) = P1*x*sin(x^2+P2)z2=Z2(2,2,3)fz2=feval(Z2,2,2,3)z2 =2.6279fz2 =2.62797.6函数句柄 7.6.1 函数句柄的创建和观察【例7.6-1】为MATLAB 的“内建”函数创建函数句柄,并观察其内涵。
(1)hsin=@sin;(2)class(hsin)size(hsin)ans =function_handleans =1 1(3)CC=functions(hsin)CC =function: 'sin'type: 'overloaded'file: 'MATLAB built-in function'methods: [1x1 struct](4)CC.methodsans =sym: 'd:\matlabr12\toolbox\symbolic\@sym\sin'7.6.2函数句柄的基本用法【例7.6-2】本例通过sin函数及其句柄演示若干基本用法。