【问题标题】:Difference between a function handle and function函数句柄和函数的区别
【发布时间】:2018-03-05 14:20:29
【问题描述】:

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

【问题讨论】:

标签: matlab function


【解决方案1】:

我不知道 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

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

【讨论】:

  • 读者注意:函数句柄可以像指针一样作用,因为您的示例f=@(b)sum(b) 是指向函数sum 的指针。可能值得一提的是,匿名函数本身可以是函数,例如f=@(b) b.^2 + 5*b + 1
  • 在现有的基础上创建函数句柄怎么样?比如,f=@sumsum 有什么区别?
  • @Rickyim 可读性。这是完全可能的(正如我已经在我的示例中展示了多个函数),只是难以阅读。如前所述,在arrayfun(@sum,array) 之类的东西中也有必要。
  • 谢谢!后一个原因是不能将函数名本身传递给需要函数句柄的函数吗?
  • @Rickyim 是的。您不想在对arrayfun 的调用中调用该函数本身,而是告诉arrayfun 在后台它需要使用该特定函数。所以从某种意义上说,我猜这是一个类似 C/C++ 的指针。 arrayfun(@sum,sum(array)) 也可以,然后你同时使用 function sum 和 handle (基本上你使用 sum(array) 创建一个新数组并让arrayfun 使用 sum 对其进行操作。)我建议您稍微玩一下函数句柄和匿名函数以了解它们。
猜你喜欢
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多