利用函数句柄执行函数

函数句柄的创建

1.函数句柄的创建

与图形对象的句柄不同,函数句柄不是在函数文件创建时自动创建的,而是必须通过专门的定义。创建函数句柄使用“@”符号或str2func命令实现。

h_fun=@fun  %创建函数句柄

h_fun=str2func('fun')  %创建函数句柄

h_array=str2func({'fun1', 'fun2', …})  %创建函数句柄数组

【例5.20】  创建MATLAB内部函数的句柄。

>>h_sin=@sin;  %创建函数句柄

>>h_cos=str2func('cos');  %创建函数句柄数组

>>h_array=str2func({'sin','cos','tan'})

@sin @cos @tan

2.使用函数句柄的优点

利用函数句柄执行函数的优点有以下几点。

(1)在更大范围内调用函数。函数句柄包含了函数文件的路径和函数类型,即函数是否为内部函数、M或P文件、子函数、私有函数等。无论函数所在的文件是否在搜索路径上,是否是当前路径,是否是子函数或私有函数,只要函数句柄存在,函数就能够执行。

(2)提高函数调用的速度。不使用函数句柄时,对函数的每次调用都要为该函数进行全面的路径搜索,直接影响了速度。

(3)使函数调用像使用变量一样方便、简单。

(4)可迅速获得同名重载函数的位置、类型信息。

函数也可以使用feval命令直接执行,feval命令可以使用函数句柄或函数名。

[y1,y2, …]=feval(h_fun,arg1,arg2…)

[y1,y2, …]=feval('funname',arg1,arg2…)

说明:h_fun是函数句柄;'funname'是函数名;arg1、arg2…是输入参数;y1、y2…是输出参数。

functiony=Ex0520(z1)

%EX0520 利用函数句柄执行函数,二阶系统时域响应

t=0:0.1:20;

h_plotxy1=str2func('plotxy1')%创建函数句柄

h_plotxy2=str2func('plotxy2')%创建函数句柄

h_plotxy3=str2func('plotxy3')%创建函数句柄

if(z1>=0)&(z1<1)

y=feval(h_plotxy1,z1,t);%执行函数

elseif z1==1

y=feval(h_plotxy2,z1,t);%执行函数

y=feval(h_plotxy3,z1,t);%执行函数

function y1=plotxy1(zeta,x)

%画欠阻尼二阶系统时域曲线

y1=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta));

function y2=plotxy2(zeta,x)

%画临界阻尼二阶系统时域曲线

y2=1-exp(-x).*(1+x);

function y3=plotxy3(zeta,x)

%画过阻尼二阶系统时域曲线

y3=1-1/(2*sqrt(zeta^2-1))*(exp(- ((zeta-sqrt(zeta^2-1))*x))./(zeta-sqrt(zeta^2-1)) …

-exp(-((zeta+sqrt(zeta^2-1))*x))./(zeta+sqrt(zeta^2-1)));

在MATLAB的命令窗口调用该Ex0520函数有3种格式。

(1)用feval命令利用函数句柄执行。

>>h_Ex0520=str2func('Ex0520')

>>y=feval(h_Ex0520,1);

(2)用feval命令利用函数名执行。

>>y=feval('Ex0520',1);

(3)直接调用函数。