數(shù)組可以明顯慢于MATLAB中的顯式循環(huán)。為什么?考慮以下簡單的速度測試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在我的機(jī)器上(LinuxMint 12上的Matlab2011B),這個測試的輸出是:Elapsed time is 1.020689 seconds.Elapsed time is 9.248388 seconds.什么?!?arrayfun雖然無可否認(rèn),這是一個更干凈的解決方案,但速度卻慢了好幾個數(shù)量級。這里發(fā)生什么事情?此外,我還做了類似的測試cellfun發(fā)現(xiàn)它比一個顯式循環(huán)慢了大約3倍。同樣,這個結(jié)果與我所期望的相反。我的問題是:為什么arrayfun和cellfun這么慢?考慮到這一點(diǎn),是否有充分的理由使用它們(除了使代碼看起來很好)?注:我說的是標(biāo)準(zhǔn)版本的arrayfun這里,不是來自并行處理工具箱的GPU版本。編輯:我只想說清楚,我知道Func1如Oli所指出的,可以將上面的內(nèi)容矢量化。我之所以選擇它,只是因?yàn)闉榱藢?shí)際問題的目的,它產(chǎn)生了一個簡單的速度測試。編輯:按照格倫蓋塔的建議,我重新做了測試feature accel off..結(jié)果如下:Elapsed time is 28.183422 seconds.Elapsed time is 23.525251 seconds.換句話說,很大一部分區(qū)別在于JIT加速器在加速顯式方面做得更好。for循環(huán)arrayfun..這對我來說很奇怪,因?yàn)閍rrayfun實(shí)際上提供了更多的信息,即它的使用揭示了調(diào)用的順序Func1沒關(guān)系。另外,我注意到無論JIT加速器是打開還是關(guān)閉,我的系統(tǒng)都只使用一個CPU.
數(shù)組可以明顯慢于MATLAB中的顯式循環(huán)。為什么?
慕俠2389804
2019-06-20 15:34:47