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 函数(arrayfuncellfunstructfunspfun)还是简单地使用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 循环的主要内容,如果未能解决你的问题,请参考以下文章

Matlab中用内建函数代替for循环

arrayfun 可能比 matlab 中的显式循环慢得多。为啥?

matlab批量处理元胞数组函数-cellfun

在具有 GPU 加速的 arrayfun 中使用匿名函数 (Matlab)

MATLAB3: 矩阵分块函数mat2cell 及 cellfun 函数

matlab学习 any 和cellfun用法