MATLAB中函数句柄和函数本身有什么区别?它是否像C / C ++中的函数指针和函数之间的区别?
我不知道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
。
关于“可能”接受输入/输出的注意事项:
您可以将函数定义为
qazxswpoi
这是一个完全有效的函数,它不接受输入或输出参数。