数组可以明显慢于MATLAB中的显式循环。为什么?考虑以下简单的速度测试arrayfun:T = 4000;N = 500;x = randn(T, N);Func1 = @(a) (3*a^2 + 2*a - 1);ticSoln1 = ones(T, N);for t = 1:T
for n = 1:N
Soln1(t, n) = Func1(x(t, n));
endendtocticSoln2 = arrayfun(Func1, x);toc在我的机器上(LinuxMint 12上的Matlab2011B),这个测试的输出是:Elapsed time is 1.020689 seconds.Elapsed time is 9.248388 seconds.什么?!?arrayfun虽然无可否认,这是一个更干净的解决方案,但速度却慢了好几个数量级。这里发生什么事情?此外,我还做了类似的测试cellfun发现它比一个显式循环慢了大约3倍。同样,这个结果与我所期望的相反。我的问题是:为什么arrayfun和cellfun这么慢?考虑到这一点,是否有充分的理由使用它们(除了使代码看起来很好)?注:我说的是标准版本的arrayfun这里,不是来自并行处理工具箱的GPU版本。编辑:我只想说清楚,我知道Func1如Oli所指出的,可以将上面的内容矢量化。我之所以选择它,只是因为为了实际问题的目的,它产生了一个简单的速度测试。编辑:按照格伦盖塔的建议,我重新做了测试feature accel off..结果如下:Elapsed time is 28.183422 seconds.Elapsed time is 23.525251 seconds.换句话说,很大一部分区别在于JIT加速器在加速显式方面做得更好。for循环arrayfun..这对我来说很奇怪,因为arrayfun实际上提供了更多的信息,即它的使用揭示了调用的顺序Func1没关系。另外,我注意到无论JIT加速器是打开还是关闭,我的系统都只使用一个CPU.
添加回答
举报
0/150
提交
取消