matlab 匿名函数函数句柄(2012-05-11 11:35:05)转载▼分类:study与matlab标签:教育一、函数句柄所谓函数句柄,个人认为可以将其理解成一个函数的代号,就像一个人的名字。
这样在调用时可以调用函数句柄而不用调用该函数。
语法如下:变量名= @ 函数名;@的作用就是将一个函数的函数句柄赋值给等号左边的变量。
在调用函数时就可以调用该句柄,可以实现同样的功能。
例:首先我们写一个求均值的函数:function y=average(x)y=mymean(x);function a=mymean(v)a=sum(v)/length(v);定义一个数组z:z=[1,2,3,4,5,6,7];>> average(z)ans =4>> handle=@averagehandle =@average>> ave=@averageave =@average>> ave(z)ans =4二、匿名函数相当于C语言中的函数指针(入口地址),只不过句柄就用一个唯一的常整数来指出匿名函数是函数句柄的一种特殊用法,这里所得到的函数句柄变量不指向特定的函数(即不指向函数M文件中的函数名),而是指向一个函数表达式(具体表达式)。
语法如下:变量名=@(输入参数列表)运算表达式;例子:为了说明问题,我们用简单的两个数相加,>> sum=@(x,y)x+ysum =@(x,y)x+y>> sum(2,3)ans =5%%%%%%%%%%%%%%%%%%%比如定义f(x)=x^2,可以写为f=@(x)(x.^2)其中@(x)(x.^2)就是匿名函数,第一个括号里面是自变量,第二个括号里面是表达式,@是函数指针f=@(x)(x.^2)表示将匿名函数@(x)(x.^2)赋值给f,于是f就表示该函数。
于是f(2)=2.^2=4;f(1:3)=[1:3].^2=[1 4 9]等等定义匿名函数时也可以调用别的匿名函数,比如f1=@(x,y)(x.^2+y.^2)定义了函数x^2+y^2f2=@(t)(f1(t,2))定义了函数t^2+4f3=@(x)(f1(x(1),x(2)))定义了函数x(1)^2+x(2)^2使用匿名函数时一定要注意函数本身的参数形式,如f1(2,3)表示2^2+3^2f2(3)=3表示3^2+4f3([1,2])表示1^2+2^2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%三、内联函数内联函数和普通的函数句柄,准确说跟匿名函数比较类似,可以通过一个函数表达式近而得到该函数。
语法格式如下:1 变量名=inline(表达式);2 变量名=inline('函数表达式', '变量名1','变量名2', ... ,'变量名n');(推荐)例如:1>> a='x+y'a =x+y>> f=inline(a)f =Inline function:f(x,y) = x+y>> f(2,3)ans =52>> f=inline('x+y','x','y')f =Inline function:f(x,y) = x+y>> f(2,3)ans =5%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%创建句柄函数str2func函数才支持生成匿名函数句柄1.>> syms x2. f = diff(sin(x)*exp(sqrt(x)),2)3.g = str2func(['@(x)' vectorize(char(f))])4.f1 = quad(g,1,2)/thread-93472-1-1.html%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%sqr=@(x)x.^2;可以将它传递到其他函数的参数列表中。
下面的代码将sqr匿名函数传递给matlab函数quad 来计算它从0到1的积分:[c-sharp]view plaincopyprint?>> quad(sqr,0,1)ans =0.3333/dfd1r/article/details/6279125%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%匿名函数在定义过程中可以调用任何Matlab函数(包括用户自定义的函数),也可以使用当时Matlab工作区中存在的任何变量。
例如,下例中的匿名函数b_humpsab在定义时就是用了Matlab工作区中的变量a和b:>> a = -.3;b=-.9;>> b_humpsab = @ (x) 1./((x+a).^2+0.01)+1./((x+b).^2+0.04)-6;>> b_humpsab([-1 0 1])ans =-5.1378 5.1765 16.0000我们看到:b_humpsab在定义时引用了前面定义的变量a和b。
应当注意,当a或b的值变化时,匿名函数并不改变,这是因为函数句柄值捕捉它创建时刻的变量的值,并不随变量的变化而变化。
>> a = 0; %changing the value of a does not chang the function.>> b_humpsab([-1 0 1]) %evaluate again , get the same resultsans =-5.1378 5.1765 16.0000我们也可以针对一个内置函数或一个M文件函数创建匿名函数句柄。
下面函数分别给予M 文件函数humps和Matlab内置函数cos创建了两个文件句柄:>> c_Mfile = @humps %function handle for M-file functionc_Mfile =@humps>> c_Mfile(1) %evaluate humps(1)ans =16>> c_builtin = @cosc_builtin =@cos>> c_builtin(pi)ans =-1由上面可知,要创建一个内置函数或一个M文件函数的句柄也很容易,只要在等号右边使用@符号,并在该符号后紧跟内置函数名或M文件函数名即可。
我们还可以利用单元数组同时创建多个内置函数和M文件函数的句柄,验证这些函数时,只要引用该函数所在单元即可。
例如,下面的代码将上面两个独立创建的句柄利用一个单元数组c_dan创建在一起:>> c_dan = {@humps @cos}c_dan =@humps @cos>>c_dan{1}(1) %evaluate humps(1)ans =16>> c_dan{2}(pi) %evaluate cos(pi)ans =-1Matlab还专门提供了一些函数来处理和应用句柄。
例如,函数functions将返回一个句柄的详细信息,如下例所示:>> functions(c_Mfile)ans =function: 'humps'type: 'simple'file: 'C:\Program Files\MATLAB\R2009a\toolbox\matlab\demos\humps.m'>> functions(c_builtin)ans =function: 'cos'type: 'simple'file: ''>> functions(b_humps)ans =function: '@(x)1./((x+a).^2+0.01)+1./((x+b).^2+0.04)-6'type: 'anonymous'file: ''workspace: {[1x1 struct]}需要注意的是:fuctions函数通常只在调试程序时使用,因为它的返回值很容易发生变化。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%句柄函数所谓句柄函数, 个人理解其实和别名差不太多, 比较类似于linux下alias命令, 即可以对某个函数以别名来调用, 而同时并不改变原来的命令名. 这样当我们想使用某个函数的时候只要直接调用函数句柄而不用调用整个函数.这里我们的函数句柄也是存放在变量的里面, 我们知道在matlab环境中变量可以用来存放很多东西, 包括数值, 字符串等等, 在这里不妨可以理解为存放函数. 不过显然我们以前所调用的各个函数都是一个一个的m文件, 不可能直接放到变量的里面, 因此我们是抓住函数的句柄(handle)来实现. 将句柄函数赋值给变量需要用到@符号, 晕, @原来在matlab里面也是有的....语法: 变量名=@函数名. 此处的函数名可以使当前matlab中可以使用的任意函数. @的作用就是将一个函数的函数句柄赋值给等号左边的变量.在需要调用函数的时候直接调用句柄即可实现同样的功能.示例z=[1 2 3]; s=@sum; s(z)此后可以直接用使用s()来替代原来的求和函数sum().匿名函数匿名函数可以说是函数句柄的一种特殊的用法, 这里所得到的函数句柄变量不指定向特定的函数(即不指向函数m文件中的函数名), 而是指向一个具体的函数表达式.语法:变量名=@(输入参数列表)运算表达式示例lc=@(x,y,z)(x*y*z); lc(2,3,4);即可得到结果为24.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%varargin和varargout函数的使用举例:function testvar(argA,argB,varargin)optargin=size(varargin,2);stdargin=nargin-optargin;fprintf('Number of inputs=%d\n',nargin)fprintf('Inputs from individual arguments(%d):\n',stdargin)if stdargin >=1fprintf(' %d\n, argA')endif stdargin==2fprintf(' %d\n, argB')endfprintf('Inputs packaged in varargin(%d):\n', optargin)for k=1:size(varargin,2)fprintf(' %d\n', varargin{k})end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%函数句柄的调用:function x=plotfhandle(fhandle,data)plot(data,fhandle(data))调用: plotfhandle(@sin,-pi:0.01:pi)函数句柄的操作:functions:返回函数句柄的相关信息func2str:根据函数句柄创建一个函数名的字符串str2func:由一个函数名的字符串创建一个函数句柄save:从当前工作区间向M文件保存函数句柄load:从一个M文件中向当前工作区间调用函数句柄isa:判断一个变量是否包含一个函数句柄isequal:判断两个函数句柄是否为某一相同函数的句柄传送特定类型的参数(1)传送字串使用命令方式调用函数,本身就传送字串使用函数方式调用函数时,被传送的字串一定要放在单引号内,其实这就是字串的定义。