MATLAB中函数句柄和函数本身有什么区别?它是否像C / C ++中的函数指针和函数之间的区别?
答案 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
函数句柄的使用有几个原因,其中我认为最突出的两个:在“伪装循环函数”中,例如arrayfun
或bsxfun
,需要像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
这是一个完全有效的函数,它不接受输入或输出参数。