0

fundoubleを返す関数があります。n関数timesを呼び出して、結果を配列に格納したいと思います。

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

ループなしでこれを達成できますか?

nは最大10,000,000の範囲であり、の実行時間funはほとんど無視できます。


私は試しarrayfunましたが、実際にはかなり遅いです(約87倍遅い):

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

ループはすでに最速の解決策である可能性がありますか?これがワンライナーでできるかどうか、私はまだ興味があります。

4

2 に答える 2

5

まず、ARRAYFUNには基本的に内部に隠されたforループがあることを知っているので、速度が上がるかどうかはわかりません。さらに、古き良きforループは、Just-in-Timeコンパイラの最適化の恩恵を受けることがあるので、ループに固執してください:)

コードを本当に最適化したい場合は、1つの値を返すたびにMATLABからn回呼び出すのではなく、一度にn個の要素の配列を返すようにJava関数を記述します(ここでのボトルネックは呼び出しのオーバーヘッドです)。

于 2012-06-29T17:19:30.710 に答える
1

私があなたの質問を正しく理解し、fun毎回ランダム/または異なるダブルを返す場合は、ループが進むべき道です。

于 2012-06-29T17:05:38.187 に答える