为什么在不正确的上下文中使用此函数句柄?

时间:2015-08-20 23:24:43

标签: arrays matlab function anonymous-function

我正在尝试了解如何将函数传递给varfun,我认为这些函数适用于arrayfuncellfun等。

读取帮助文件时,第一个参数应为:

  

函数,指定为函数句柄。您可以在文件中定义函数或将其定义为匿名函数。如果func对应多个函数文件(即,如果func表示一组重载函数),MATLAB将根据输入参数的类确定要调用的函数。

所以我尝试使用以下数据:

sampleId = [1 1 1 3 3 3]';
entity = [1 2 3 1 4 5]';
dataTable = table(sampleId, entity)

是的:

varfun(@mean, dataTable)

ans = 

    mean_sampleId    mean_entity
    _____________    ___________

    2                2.6667     

现在,当我匿名定义自己的函数时,我的问题出现了,例如:

mymean = @(x){sum(x)/length(x)};

然后抛出错误

varfun(@mymean, dataTable)
Error: "mymean" was previously used as a variable, conflicting with its use here as the name of a function or command.
See "How MATLAB Recognizes Command Syntax" in the MATLAB documentation for details.

然而,如果我不使用at符号,我会得到:

varfun(mymean, dataTable)

ans = 

    Fun_sampleId    Fun_entity
    ____________    __________

    [2]             [2.6667]  

我觉得我必须在错误的上下文中使用函数句柄@。任何人都可以开导我吗? (注释,如评论中所述,ans的显示很奇怪,因为mymean返回一个单元格数组。这是一个无意的错误。)

1 个答案:

答案 0 :(得分:2)

在第一个代码段中,mean(named) function@mean是该功能的function handle。您可以等效地使用

f = @mean;
varfun(f, dataTable)

在第二种情况下,定义

mymean = @(x){sum(x)/length(x)};

@(x){sum(x)/length(x)}部分是anonymous function,变量mymean再次是该(匿名)函数的函数句柄。因此,您需要使用varfun(mymean, dataTable),而不是varfun(@mymean, dataTable)

因此,@符号正在使用in two different ways,尽管在这两种情况下它都会产生一个函数句柄:

  • 案例1:从命名函数创建函数句柄。命名函数是在其自己的文件中定义的函数。
  • 案例2:作为匿名函数定义的一部分。匿名函数是直接定义的,而不是在单独的文件中定义。该定义构造一个匿名函数并自动返回该函数的句柄。