2012-06-29 104 views
0

我有一個函數fun,它返回一個double。我想調用的函數n時間和存儲結果在一個數組:沒有for循環的n個函數結果的數組

results = zeros(1, n); 
for i = 1:n 
    results(i) = fun; 
end 

我能做到這一點不循環?

n在高達10,000,000的範圍內,fun的運行時間幾乎可以忽略不計。


我試過arrayfun,但它實際上是慢了很多(約87倍慢):

results = arrayfun(@(~) fun, 1:n); 

可循環已經是最快的解決方案?如果這可以用一個班輪完成,我仍然會感興趣。

+0

它總是會返回相同的值嗎?什麼是「樂趣」取決於? –

+0

@ S.P否,它不會總是返回相同的結果。 'fun'是一種外部的Java方法。 – kay

+1

沒有其他選擇,我知道。你需要循環它。 –

回答

5

首先,知道ARRAYFUN裏面基本上有一個隱藏的for-loop,所以我不確定你會獲得速度。再加上良好的舊for循環有時可以從Just-in-Time編譯器優化中受益,所以堅持循環:)

如果你真的想優化你的代碼,編寫你的Java函數來返回一個包含n個元素的數組一次,而不是從MATLAB每次調用n次返回一個值(瓶頸是這裏的調用開銷)。

+0

請注意,在未來的版本中,'arrayfun'可能會變成多線程。 – Jonas

+0

@Amro,我猜想改變Java功能是最好的(最快的)解決方案。我沒有想過。謝謝! – kay

+0

@Jonas:真的,我認爲它已經[支持](http://www.mathworks.com/help/toolbox/distcomp/arrayfun.html)在GPU上運行 – Amro

1

如果我正確理解你的問題,並且fun每次都返回一個隨機/或不同的double,那麼循環就是要走的路。

相關問題