最佳答案
考虑以下 arrayfun
的简单速度测试:
T = 4000;
N = 500;
x = randn(T, N);
Func1 = @(a) (3*a^2 + 2*a - 1);
tic
Soln1 = ones(T, N);
for t = 1:T
for n = 1:N
Soln1(t, n) = Func1(x(t, n));
end
end
toc
tic
Soln2 = arrayfun(Func1, x);
toc
在我的机器上(Linux Mint 12上的 Matlab 2011b) ,这个测试的输出是:
Elapsed time is 1.020689 seconds.
Elapsed time is 9.248388 seconds.
什么? ! ? abc 0,虽然公认看起来更干净的解决方案,是一个数量级慢。这是怎么回事?
此外,我对 cellfun
进行了类似的测试,发现它比显式循环慢3倍左右。同样,这个结果与我的预期相反。
我的问题是: 为什么 arrayfun
和 cellfun
这么慢?考虑到这一点,使用它们有什么好的理由吗(除了让代码看起来不错之外) ?
注意: 我在这里谈论的是 arrayfun
的标准版本,而不是并行处理工具箱中的 GPU 版本。
编辑: 只是为了清楚,我知道上面的 Func1
可以像 Oli 指出的那样向量化。我之所以选择它,是因为它为实际问题提供了一个简单的速度测试。
编辑: 根据 grungetta 的建议,我用 feature accel off
重新做了测试,结果是:
Elapsed time is 28.183422 seconds.
Elapsed time is 23.525251 seconds.
换句话说,很大一部分区别似乎在于 JIT 加速器在加速显式 for
循环方面比 arrayfun
做得更好。这对我来说似乎很奇怪,因为 arrayfun
实际上提供了更多的信息,也就是说,它的使用表明对 Func1
的调用顺序并不重要。此外,我注意到,无论是开启或关闭 JIT 加速器,我的系统只使用一个 CPU..。