Matlab:arrayfun、cellfun、spfun 和 structfun 与简单的 for 循环
Posted
技术标签:
【中文标题】Matlab:arrayfun、cellfun、spfun 和 structfun 与简单的 for 循环【英文标题】:Matlab: arrayfun, cellfun, spfun and structfun vs. simple for-loop 【发布时间】:2013-04-15 03:08:29 【问题描述】:哪个更好,使用所有*fun
函数(arrayfun
、cellfun
、structfun
和spfun
)还是简单地使用for
循环?
就代码的可读性而言,哪种方法可以提供更好的性能以及哪些方法应该被视为更好的实践?
【问题讨论】:
相关问题:arrayfun can be significantly slower than an explicit loop in matlab. Why? 也相关answer 我想说的是,随着 Matlab 的开发,各种计算函数的方法在数组上的相对性能会发生变化,我们当中的专业人士应该(重新)测试我们对哪种方法更快的想法每个新版本。至于代码的可读性,这是非常主观的,我害怕踩到那里。 例如,MATLAB 当前有 arrayfun,它在 GPU 上运行gpuArray
。 Octave 有一个 parallel arrayfun 在 CPU 上使用多个进程(相当于parfor
)
另一个相关的比较问题:What is the fastest way to perform arithmetic operations on each element of a cell array?
【参考方案1】:
这真的取决于你所说的“性能”:)
如果您的意思是最短执行时间,那么,有时*fun
会更快(例如,cellfun('isempty', ...);
(是的,字符串参数!)肯定优于循环版本)。有时循环更快。如果您使用的是小于 2006 的 Matlab 版本,则默认使用 *fun
函数。如果您使用的是较新的内容,请默认使用循环。您仍然必须始终进行分析以找出哪个更快。
正如 Amro 所指出的,如果您有一个能够执行 FP 算术的 GPU,以及支持 GpGPU 的最新版本的 Matlab,那么对于 gpuArray
输入的调用 arrayfun
将被大规模并行化。但是,不能就执行时间做出一般性陈述;对于较小的数组或绝对庞大的数组,将所有内容复制到 GPU 的开销可能会抵消并行计算的任何好处,因此...分析确实是唯一确定的方法。
如果您的意思是最少编码时间,那么我会说只要操作简单,用*fun
编码通常会更快。对于任何复杂的事情,通常最好选择循环。
如果您的意思是最佳可读性,因此在专业环境中维护和实施更改所需的最少时间,当然,选择循环。
目前,您的问题还没有一个明确的简单答案:)
【讨论】:
以上是关于Matlab:arrayfun、cellfun、spfun 和 structfun 与简单的 for 循环的主要内容,如果未能解决你的问题,请参考以下文章
arrayfun 可能比 matlab 中的显式循环慢得多。为啥?
在具有 GPU 加速的 arrayfun 中使用匿名函数 (Matlab)