【发布时间】:2018-03-05 14:20:29
【问题描述】:
MATLAB 中的函数句柄和函数本身有什么区别?它就像 C/C++ 中函数指针和函数之间的区别吗?
【问题讨论】:
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
这是一个完全有效的函数,不接受输入或输出参数。
【讨论】:
f=@(b)sum(b) 是指向函数sum 的指针。可能值得一提的是,匿名函数本身可以是函数,例如f=@(b) b.^2 + 5*b + 1
f=@sum 和 sum 有什么区别?
arrayfun(@sum,array) 之类的东西中也有必要。
arrayfun 的调用中调用该函数本身,而是告诉arrayfun 在后台它需要使用该特定函数。所以从某种意义上说,我猜这是一个类似 C/C++ 的指针。 arrayfun(@sum,sum(array)) 也可以,然后你同时使用 function sum 和 handle (基本上你使用 sum(array) 创建一个新数组并让arrayfun 使用 sum 对其进行操作。)我建议您稍微玩一下函数句柄和匿名函数以了解它们。