【问题标题】:vectorize a complex for-loop and enhance the speed in R向量化复杂的for循环并提高R中的速度
【发布时间】:2013-09-11 05:41:27
【问题描述】:

您好,我正在尝试通过矢量化来加速以下 for 循环的计算,即使用 sapply() 等。

但由于结构非常复杂,这似乎是一项不可能完成的任务。我已经尝试了几天,但最终没有解决方案。

有人可以看看如何加快以下功能吗?

alpha2f <- function(p0,t2,n1,n2){
  alpha2=0
  for (x1 in 12:n1){    
    for (x2 in 0:n2){    
      for (y2 in 0:n2){
        a=dbinom(x1,n1,p0)
        b=dbinom(x2,n2,p0)
        alpha2=alpha2+a*b*dbinom(y2,n2,p0)*ifelse(ztest(x1+x2,y2,n1+n2,n2)>t2,1,0)
      }}}
  return(alpha2)
}

【问题讨论】:

  • 这样的问题应该描述代码试图做什么,以及需要改进的尝试。
  • 我尝试复制/粘贴您的函数,但得到了Error in ifelse(ztest(x1 + x2, y2, n1 + n2, n2) &gt; t2, 1, 0) : could not find function "ztest"。如果我们没有工作示例或至少描述该函数的作用,则很难提供帮助。

标签: r for-loop vector matrix sapply


【解决方案1】:

您可以通过矢量化代码并删除不必要的东西(例如 ifelse)来加快代码速度。你应该试试:

alpha2f <- function(p0, t2, n1, n2){
  alls <- expand.grid(x1=12:n1, x2=0:n2, y2=0:n2)
  a <- dbinom(alls$x1, n1, p0)
  b <- dbinom(alls$x2, n2, p0)
  z <- numeric(nrow(alls))
  X <- alls$x1+alls$x2
  N <- n1+n2
  for (i in 1:length(z))
   z[i] <- (ztest(X[i], alls$y2|i], N, n2) > t2)
  d <- dbinom(alls$y2,n2,p0)
  alpha2 <- sum(a*b*d*z)
  return(alpha2)
  }

我无法测试它,因为我不知道您使用了哪个 ztest 函数。如果这个函数是矢量化的,那么你不需要循环。 高温

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多