-
matlab
匿名函数
函数句柄
(2012-05-11 11:35:05)
转
载
教育
▼
标签:
分类:
study
< br>与
matlab
一、函数句柄
所谓函数句柄,
个人认为可以将其理解成一个函数的代号,
就像一个人的名字。
这样在调用
时可以调用函数句柄而不用调用该函数。
< br>
语法如下:
变量名
= @
函数名;
@
的作用就是将一个函数的函数句柄赋值给等号左边的变量。
在调用函数时就可以调用该句
柄,可以实现同样的功能。
例:
首先我们写一个求均值的函数:
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=@average
handle =
@average
>>
ave=@average
ave =
@average
>> ave(z)
ans =
4
二、匿名函数
相当于
C
语言中的函数指针(入口地址),只不过句柄就用一个唯一的常
整数来指出
匿名函数是函数句柄的一种特殊用法,这里所得到的
函数句柄变量不指向特定的函数(即
不指向函数
M
文件中的函数名),而是指向一个函数表达式(具体表达式)。
语法如下:
变量名
< br>=@(
输入参数列表
)
运算表达
式;
例子:
为了说明问题,我们用简单的两个数相加,
>>
sum=@(x,y)x+y
sum =
@(x,y)x+y
>> sum(2,3)
ans =
5
%%%%%%%%%%%%%%%%%%% <
/p>
比如定义
f(x)=x^2
,可以写为<
/p>
f=@(x)(x.^2)
其中
p>
@(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^2
f2=@(t)(f1(t,2))
定义了函数
t^2+4
f3=@(x)(f1(x(1),x(2)))
定义了函数
x(1)^2+x(2)^2
使用匿名函数时一定要注意函数本身的参数形式,如
f1(2,3)
表示
2^2+3^2
f2(3)=3
表示
3^2+4
f3([1,2])
表示
1^2+2^2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
三、内联函数
内联函数和普通的函数
句柄,
准确说跟匿名函数比较类似,
可以通过一个函数表达式近
而得
到该函数。
语法格式如下:
1
变量名
=inline
(表达式);
< br>
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 =
5
2
>> f=inline('x+y','x','y')
f
=
Inline function:
f(x,y) = x+y
>> f(2,3)
ans =
5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
创建
句柄函数
str2func
函数才支持生成匿名函数句柄
1.
>> syms x
2.
f =
diff(sin(x)*exp(sqrt(x)),2)
3.
g =
str2func(['@(x)'
vectorize(char(f))])
4.
f1 =
quad(g,1,2)
/
<
/p>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%
sqr=@(x)x.^2
;
可以将它传递到其他函数的参数列表中。
下面的代码将
sqr
匿名函数传递给
matlab
< br>函数
quad
来计算它从
0
p>
到
1
的积分:
[c-sharp]
view plaincopyprint?
>> quad(sqr,0,1)
ans =
0.3333
/dfd1r/article/
details/6279125
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
p>
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% <
/p>
匿名函数在定义过程中可以调用任何
Matlab
函数(包括用户自定义的函数),也可以使用
当时
Ma
tlab
工作区中存在的任何变量。例如,下例中的匿名函数
b
_humpsab
在定义时就是
用了
M
atlab
工作区中的变量
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
< br>我们看到:
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 results
ans =
-5.1378 5.1765
16.0000
我们也可以针对一个内置函数或一个
M
文件函数创建匿名函数句柄。下面函数分别给予
M
文件函数
humps
和
Matla
b
内置函数
cos
创建了两个文件句柄
:
>> c_Mfile = @humps
%function handle for M-file function
c_Mfile =
@humps
>> c_Mfile(1) %evaluate humps(1)
ans =
16
>>
c_builtin = @cos
c_builtin =
@cos
>> c_builtin(pi)
ans =
-1
由上面可
知,要创建一个内置函数或一个
M
文件函数的句柄也很容易,只
要在等号右边使
用
@
符号,并在该符号
后紧跟内置函数名或
M
文件函数名即可。
我们还可以利用单元数组同时创建多个内置函数和
M
文件函数的句柄,验证这些函数时,
只要引用该函数所在单元即可。<
/p>
例如,
下面的代码将上面两个独立创建的句柄利用一个单元
数组
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 =
-1
Matlab
还专门提供了一些函数来处理和应用句柄。例如,函数
functions
将返回一个句柄的
详细信息,
如下例所示:
>> functions(c_Mfile)
ans =
function: 'humps'
type: 'simple'
file: 'C:Program
FilesMATLABR2009atoolboxmatlabdemoshumps.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
环境中变量可以用来存放
p>
很多东西
,
包括数值
,
字符串等等
,
在这里不妨可以理解为存放函数
.
不
过显然我们以前所
调用的各个函数都是一个一个的
m
文件
,
不可能直接放到变量的里面
,
因此我
们是抓住函数
的句柄
(handle)
来实现
.
将句柄函数赋值给变量需要用到
@
符号
,
晕
, @
原来在
matlab
里面也
是有的
....
语法
:
变量名
=@
函数名
.
此处的函数名可以使
当前
matlab
中可以使用的任意函数
. @
的作用
就是将一个函数的函数句柄赋值给等号左边的变
量
.
在需要调用函数的时候直接调用句柄即
-
-
-
-
-
-
-
-
-
上一篇:体检报告中随访是什么意思
下一篇:男人对女人没有性欲究竟是什么原因?