我将一些功能存储在单元格中,例如f = {@sin, @cos, @(x)x+4}
。
是否可以同时调用所有这些功能(使用相同的输入)。我的意思是比使用循环更有效。
答案 0 :(得分:3)
在构建时,*fun
函数族为此目的而存在(例如,cellfun
是相关的函数)。它们是关于这些函数的use和performance的其他问题。
但是,如果将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]
。
答案 1 :(得分: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.
答案 2 :(得分:0)
这可能会成功
functions = {@(arg) sin(arg),@(arg) sqrt(arg)}
x = 5;
cellfun(@(arg) arg(x),functions)
希望这会有所帮助。
阿德里安。