matlab 函数句柄@的介绍_什么是函数句柄(转)

http://blog.csdn.net/kevinhg/article/details/8861774

http://www.ilovematlab.cn/thread-30375-1-1.html

http://blog.sina.com.cn/s/blog_71fb42f70100uyfx.html

----------------------------------------------------------------------------------------------

这个是matlab里边的匿名函数的标志。匿名函数的标准格式是:
fhandle=@(arglist)express
(1)express是一个matlab变量表达式,比如:x+x.^2,sin(x)等
(2)argilst是参数列表;
(3)符号@是matlab创建函数句柄的操作符,表示创建有输入参数列表arglist和表达式express确定的函数句柄,并把这个函数句柄返回给变量fhandle,这样,以后就可以通过fhandle来调用定义好的函数了。
如:
myfun=@(x)(x+x.^2)

------------------------------------------------------------------------------------------------------------------------------------------

觉得自己很少用函数句柄,但是经常遇到,所以在这里总结一下。
函数句柄:是包含了函数的路径、函数名、类型以及可能存在的重载方法。
函数句柄必须通过专门的定义创建的,而一般的图像的句柄是自动建立的。

创建函数句柄使用@或者str2func命令创建
[email=h_fun=@fun]h_fun=@fun[/email];
h_fun=str2func('fun');
比如说sin函数,[email=h_sin=@sin]h_sin=@sin[/email];   h_sin=str2func('sin');

执行sin函数     feval
feval('sin',pi/2)
ans =
     1
那么使用函数句柄有什么好处呢?
1、提高运行速度。因为matlab对函数的调用每次都是要搜索所有的路径,从set path中我们可以看到,路径是非常的多的,所以如果一个函数在你的程序中需要经常用到的话,使用函数句柄,对你的速度会有提高的。
2、使用可以与变量一样方便。比如说,我再这个目录运行后,创建了本目录的一个函数句柄,当我转到其他的目录下的时候,创建的函数句柄还是可以直接调用的,而不需要把那个函数文件拷贝过来。因为你创建的function handles中,已经包含了路径,比如说我创建了一个fun
h_fun=str2func('rei');
可以用functions来查看这个function,结果果然已经包括了路径。

——————————————————————————————————————————————————————————————————————

Matlab中的匿名函数的使用

在Matlab7.0以后的版本中,出现了一种新的函数类型–匿名函数,不但能够完成原来版本中内联函数(inline)的功能,还提供了其他更方便的功能。Matlab首席科学家Moler教授都推荐用匿名函数替代原来的内联函数。我最近学习了一些有关匿名函数的内容,现在总结一下:

1,匿名函数的基本用法。

handle = @(arglist)anonymous_function

其中handle为调用匿名函数时使用的名字。arglist为匿名函数的输入参数,可以是一个,也可以是多个,用逗号分隔。anonymous_function为匿名函数的表达式。举个例子如下:

>> f=@(x,y)x^2+y^2; 
>> f(1,2) ans =      5

当然输入的是数组也是可以的:

>> f=@(x,y)x.^2+y.^2; %注意需要点(.)运算 >> a=1:1:10; >> b=10:-1:1; >> f(a,b) ans =    101    85    73    65    61    61    65    73    85   101

匿名函数的表达式中也可以有参数的传递,比如:

>> a=1:5; 
>> b=5:-1:1;
>> c=0.1:0.1:0.5;
>> f=@(x,y)x.^2+y.^2+c;
>> f(a,b) ans =    26.1000   20.2000   18.3000   20.4000   26.5000

c作为表达式中的参数,进行了数据传递。上面都是单重匿名函数,也可以构造多重匿名函数,如:

>> f=@(x,y)@(a) x^2+y^+a; 
>> f1=f(2,3) f1 =     @(a)x^2+y^+a
>> f2=f1(4) f2 =     85

每个@后的参数从它后面开始起作用,一直到表达式的最后。

2.使用匿名函数实现符号函数的赋值运算

在老版本的Matlab中,这个功能是由inline函数完成的,现在用匿名函数完成此功能。比如:知道z=2x^3+4x+5,求z在x=3处的2阶导数值。可以先用符号函数算出z的2阶导数的表达式,然后通过匿名函数,把x赋予3的值,得到最后结果:

>> syms x; %定义符号变量 
>> z=2*x^3+4*x+5; %定义表达式
>> z1=diff(z,2) %求z的2阶导数的表达式 z1 = 12*x
>> z2=eval_r(['@(x)' vectorize(z1)]); %vectorize函数的功能是使内联函    %数适合数组运算的法则
>> z2(3) ans =     36

 

functions(h_fun)
ans = 
    function: 'rei'
        type: 'simple'
        file: 'G:\program\serial232\rei.m'

 

posted @ 2015-07-29 17:28  aminxu  阅读(12041)  评论(0编辑  收藏  举报