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

Arrays 为什么在不正确的上下文中使用此函数句柄?,arrays,matlab,function,anonymous-function,Arrays,Matlab,Function,Anonymous Function,我试图理解如何将函数传递给varfun,我认为这适用于arrayfun,cellfun等 读取帮助文件时,第一个参数应为: 函数,指定为函数句柄。您可以在文件中定义该函数,也可以将其定义为匿名函数。如果func对应于多个函数文件(即,如果func表示一组重载函数),则MATLAB将根据输入参数的类确定要调用的函数 因此,我尝试使用以下数据: sampleId = [1 1 1 3 3 3]'; entity = [1 2 3 1 4 5]'; dataTable = table(sampleId

我试图理解如何将函数传递给
varfun
,我认为这适用于
arrayfun
cellfun

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

函数,指定为函数句柄。您可以在文件中定义该函数,也可以将其定义为匿名函数。如果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
返回一个单元格数组。这是一个意外错误)。

在第一个代码段中,
mean
是a,而
@mean
是该函数的a。您可以等效地使用

f = @mean;
varfun(f, dataTable)
在第二种情况下,当您定义

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

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

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

@AndrasDeak不确定您指的是我的哪些评论。如果您想知道为什么
mymean
返回一个单元格数组,那只是一个输入错误。如果您想知道为什么我要将
mymean
放在一个单独的文件中,以便通过函数句柄调用它,那是因为我使用
eval
来构造对
varfun
的调用,所以必须使用符号consistent@Alex,我指的是后者,坚持使用
@
。那么,
eval
不可避免吗?(我想是的,我想你也只有在你真的需要的时候才使用它。)但这可能与你的问题太离题了……是的,也许这是一个单独讨论的主题,但这就是我使用
eval
的原因。我的函数
fn(function_name)
需要一个函数名作为参数,然后我通过调用
func=eval(['@'func])
来构造一个句柄。我想现在您已经告诉我要避免它,我可以直接从您的代码中传递
fn
?@Alex中的函数句柄,看起来
func
最初是一个字符串。在这种情况下,使用
str2func(func)
获取包含该函数名称的函数句柄string@Alex,还请注意,Luis提出的替代方案也将平等对待命名函数和匿名函数(这让我很难过,因为我无法对其进行投票),结果总是一个函数句柄,您可以将它传递给
varfun