如何在有恒定额外输入参数的情况下应用cellfun(或arrayfun或structfun)?

9

我想对一个单元数组中的每个元素应用一个函数——所以我可以使用cellfun。但是,这个函数需要两个额外的参数(一个字符串和一个向量),我希望保持这些参数在单元数组的所有元素中都是不变的;也就是说,我想做一些像这样的事情:

cellfun(@myfun, cellarray, const1, const2)

意思:

for i = 1:numel(cellarray),
  myfun(cellarray{i}, const1, const2);
end

有没有不创建中间单元数组的方法来实现这一点,而这些数组包含 numel(cellarray)const1const2 的副本?

2个回答

17
你可以使用一个匿名函数,并给它传入两个额外的参数来调用myfun
cellfun(@(x) myfun(x,const1,const2), cellarray)

目前我正在使用这个解决方案,但还有其他的吗?对于大数组,它可能会产生相当大的开销。除了创建一个const1, const2的副本数组(不是一个好的选择),还有其他的替代方法吗? - embert
1
@embert我不确定额外的开销从哪里产生,但也许你可以使用分析器找出来。我还建议尝试一下问题中的for循环替代方案,因为在MATLAB中,for循环不会像以前那样产生惩罚(有时甚至是最快的替代方案)。 - gnovice

4
另一个技巧是在索引上使用ARRAYFUN:
arrayfun(@(k) myfun(cellarray{k},const1,const2), 1:numel(cellarray))

如果myfun的返回值不是标量,则您可能需要设置'UniformOutput',false选项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接