第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后面同一行。
第七章 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函数及其句柄演示若干基本用法。