2

を使用して実行する一連の計算があるとしますforeach。おそらく、現在または将来、それらを並列化する必要があります。各計算は単一の数値を返します。この方法で計算されたすべての数値の平均を取得するための最良のイディオムは何ですか?

私は2つの解決策を念頭に置いており、可能な限り回答を投稿して、これらを個別に投票してコメントしたり、編集して改善したりできるようにします。しかし、もっと良い方法があるかもしれないと思うので、追加の回答を歓迎します。私の答えには、あなたがあなた自身のテクニックを示すために採用できる例が含まれます。

4

2 に答える 2

0

1つのソリューションは、結果をベクトルに蓄積し、最終的meanにその上で関数を実行します。

> foreach(i = icount(300), .combine = c, .inorder = FALSE, .multicombine = TRUE,
+         .final = mean) %do% { i*7 %% 11 }
[1] 1053.5

利点:

  • ネストされたforeach呼び出しでも機能します
  • 以外の集計関数でも動作meanします
  • 反復の値の数に関する知識は必要ありません

欠点:

  • 最初にすべての結果をベクトルに収集します。これは、特に非常に小さなジョブを大量に実行する場合に、不必要な量のメモリを消費する可能性があります。
于 2012-12-06T13:51:39.530 に答える
0

1つのソリューションは、結果を1つの合計に累積し、最終的にこの合計を反復回数で除算します。

> foreach(i = icount(300), .combine = '+', .inorder = FALSE,
+         .final = function(x) x/300) %do% { i*7 %% 11 }
[1] 1053.5

利点:

  • 単一の数値の合計にメモリが必要なだけです。これはパフォーマンスの向上になります。
  • ネストされたforeach呼び出しでも機能します

欠点:

  • の引数リストで反復回数を繰り返す必要がありますforeach。この例では、数値は定数であるため、これは簡単であり、単一の変数または単一のベクトルの長さを使用することはそれほど難しくありません。ただし、反復が複数のベクトルにまたがる場合、またはサイズが不明なイテレータの場合、事態はさらに困難になり、一貫性のない変更によるエラーが見過ごされる可能性があります。
于 2012-12-06T13:56:18.850 に答える