3

我将一些功能存储在单元格中,例如f = {@sin, @cos, @(x)x+4}.

是否可以同时调用所有这些函数(使用相同的输入)。我的意思是比使用循环更有效的东西。

4

3 回答 3

3

正如所构建的那样,*fun函数族是为此目的而存在的(例如,cellfun这里是相关的)。它们是关于这些功能的使用性能的其他问题。

但是,如果您构造f为将元胞数组构造为的函数

f = @(x) {sin(x), cos(x), x+4};

那么您可以更自然地调用该函数:f([1,2,3])例如。此方法还避免了对非标量参数所需的 ( 'UniformOutput', false) 选项对的需要。cellfun

您也可以使用常规双精度数组,但是您需要警惕用于连接目的的输入形状:@(x) [sin(x), cos(x), x+4]@(x) [sin(x); cos(x); x+4].

于 2014-12-04T12:49:50.520 回答
3

我只是在这里发布这些基准测试结果,只是为了说明循环不一定比其他方法慢:

f = {@sin, @cos, @(x)x+4};
x = 1:100;
tic
for ii = 1:1000
    for jj = 1:numel(f)
        res{jj} = f{jj}(x);
    end
end
toc

tic
for ii = 1:1000
    res = cellfun(@(arg) arg(x),functions,'uni',0);
end
toc

Elapsed time is 0.042201 seconds.
Elapsed time is 0.179229 seconds.

特洛伊的答案几乎是循环方法的两倍:

tic
for ii = 1:1000
    res = f((1:100).');
end
toc
Elapsed time is 0.025378 seconds.
于 2014-12-04T12:53:19.910 回答
0

这可能会奏效

functions = {@(arg) sin(arg),@(arg) sqrt(arg)}
x = 5;
cellfun(@(arg) arg(x),functions)

希望这可以帮助。

阿德里安。

于 2014-12-04T12:39:04.190 回答