函数句柄和函数之间的区别

时间:2018-03-05 14:20:30

标签: matlab function

MATLAB中函数句柄和函数本身有什么区别?它是否像C / C ++中的函数指针和函数之间的区别?

1 个答案:

答案 0 :(得分:0)

我不知道C / C ++,但在MATLAB中,函数是一个非匿名程序,它(可能)接受输入并且(可能)给出输出,并使用function关键字定义,例如

function a = MySum(b)
    a = sum(b);
end

而函数句柄是一种匿名函数的快捷方式,即不能从该脚本外部调用。它是使用@语法创建的:

f=@(b)sum(b);

该函数保存为.m文件,函数名称为文件名,因此,使用上面的示例MySum.m。将此保存在您的路径上,并根据上述定义了匿名函数,这就是您调用它们的方式:

b = [1 2];
f=@(b)sum(b);
aFunction = MySum(b); % = 3
aAnon = f(b); % =3

如果我们现在在同一路径上有一个新脚本,如果我们不定义它,我们就不能使用匿名函数,请尝试:

b = [1 2];
aFunction = MySum(b); % = 3
aAnon = f(b); % gives error that f is undefined

如果在路径之外创建脚本,则函数本身也将失败:

b = [1 2];
aFunction = MySum(b); % gives error that MySum is undefined
aAnon = f(b); % gives error that f is undefined

函数句柄的使用有几个原因,其中我认为最突出的两个:在“伪装循环函数”中,例如arrayfunbsxfun,需要像arrayfun(@function,array)这样的语法,或使用例如脚本中经常使用某种功能组合,例如nnz(rand(size(N)>M),缩短序列:f = @(M,N)nnz(rand(size(N)>M)现在可以拨打f(N,M)而不是nnz(rand(size(N)>M)

Wolfie's comment之后,确实存在函数句柄的双重性质:它可以充当指针,即上例中的f如何是指向函数sum的指针,但也可以是一个函数,就像函数nnz(rand(size(N)>M)或多项式之类的组合f=@(b) b.^2 + 5*b + 1一样。

注意“可能”接收输入/输出:

您可以将函数定义为

function MySine()
    x = 1:10;
    y = sin(x);
    plot(x,y)
end

这是一个完全有效的函数,它不接受输入或输出参数。