數組可以明顯慢于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.
數組可以明顯慢于MATLAB中的顯式循環。為什么?
慕俠2389804
2019-06-20 15:34:47