迭代过程的最有效条件

时间:2018-03-10 16:37:01

标签: r conditional vectorization mcmc

我试图对估计算法的收敛标准的选择进行功能化,该算法将循环数百到数千个Gibbs周期;它需要在每个周期后计算。随着样品的增加,每毫秒剃须都有帮助。我正在寻找实施这个"选择的最快方式"用户,使用逻辑来选择要与先前迭代进行比较的估计。这些测试的结果对我来说并不直观(在R中...可能是因为我不太了解"矢量化"并且我的假设过于乐观)。有人可以解释结果,因为它让我觉得我应该停止尝试创造性,并继续做最简单的事情,即if {} else if {} else if {} else if {} else if ... else {}

# Generate test data
xa<-rnorm(10000);xb<-rnorm(1000);xc<-rnorm(100);xd<-rnorm(10)
ya<-runif(10000);yb<-runif(1000);yc<-runif(100);yd<-runif(10)

# look at outputs; make choice
sapply(list(xa-ya,xb-yb,xc-yc,xd-yd),max)
test<-as.logical(c(0,0,0,1))

# Test 1
system.time(replicate(10000,{
  eps<-max(list(xa-ya,xb-yb,xc-yc,xd-yd)[[which(test)]])
}))
#user  system elapsed 
#0.14    0.12    0.27 

# Test 2
system.time(replicate(10000,{
  eps<-sapply(list(xa-ya,xb-yb,xc-yc,xd-yd),max)[test]
}))
#user  system elapsed 
#0.44    0.00    0.44 

# Test 3
system.time(replicate(10000,{
  if (test[1]) {
    eps<-max(xa-ya)
  } else if (test[2]) { 
    eps<-max(xb-yb)
  } else if (test[3]) {
    eps<-max(xc-yc)
  } else {
    eps<-max(xd-yd)
  }
}))
# user  system elapsed 
# 0.02    0.00    0.02 

连接到问题,在循环的主干中调用函数中嵌入更多if else语句,或者为条件&#34;选择&#34;制作多个函数是否有意义。并将if else语句保留在主干中?

1 个答案:

答案 0 :(得分:0)

我认为你主要是要求解释你的时间安排结果。 (我不认为解释需要任何矢量化的调用,而是认为答案在于考虑表达式的评估顺序。)在除最后一个之外的所有情况中,代码将导致对所有四个的评估。减法表达式。并且还会构建一个临时对象来保存结果列表。只有最后一个才能避免这个过程。当评估if (.){.}并且前提是FALSE时,没有对结果进行评估。所以只评估eps<-max(xd-yd)。没有其他结果被评估。