Rのforeach関数を使って並列計算をしたい (その1)
foreach関数とは
Rでfor文を回すことはご法度らしいです. 計算が遅いので.
Rの高速化のために様々な手段が考えられます.
その1つが並列計算です.
Rのforeach関数は, Rで並列計算をする際にしばしば登場します.
この関数で何ができるのかよく分かりません.
なので, 今回は並列計算の前に, foreach関数の確認をします.
使い方
for文のような関数らしいです.
基本的な使い方...
foreach(i = 範囲, .combine = 結果の出力形式) %do% {関数}
イテレータの範囲と出力, 関数を指定します.
詳しくはドキュメントを参照します.
http://cran.r-project.org/web/packages/foreach/foreach.pdf
よく分かりません.
# foreach.r 2013-08-17 # foreach package test # install.packages("foreach") library(foreach) # 1から4までの平方根を並べたベクトルを作ります. # 範囲は1:4, 出力形式について .combine = c とするとベクトルになります. x <- foreach(i=1:4, .combine = c) %do% sqrt(i) x #[1] 1.000000 1.414214 1.732051 2.000000
なるほど.
出力形式を変えてみます.
# 結果の総和が欲しいので, .combine = '+' とします pi <- foreach(i=1:100, .combine='+') %do% { 1/i /i } sqrt(pi*6) #[1] 3.132077 # 結果の積が欲しいので, .combine = '*' とします fact <- foreach(i=1:10, .combine='*') %do% { i } fact #[1] 3628800
演算子でもって結合させました.
ベクトル同士の結合もできます.
rbind(行ベクトルとして結合) とcbind(列ベクトルとして結合)ができます.
x <- foreach(a=1:3, b=4:6, .combine=rbind) %do% {c(a,b)} x # [,1] [,2] #result.1 1 4 #result.2 2 5 #result.3 3 6 x <- foreach(a=1:4, b=4:6, .combine=cbind) %do% {c(a,b)} x # result.1 result.2 result.3 #[1,] 1 2 3 #[2,] 4 5 6
なるほど.
計算速度の比較
foreach関数は何が嬉しいのでしょうか.
for文よりも速かったら泣いて喜びます.
実験しました.
# foreach関数を使います. before = proc.time() x <- foreach(i = 1:10000, .combine = c) %do%{ sum(rnorm(100)) } proc.time() - before # ユーザ システム 経過 # 3.691 0.008 3.699 # for文を回します before = proc.time() for(i in 1:10000){ sum(rnorm(100)) } proc.time() - before # ユーザ システム 経過 # 0.184 0.002 0.186
(。>﹏<)
つづきます.