如何使数组的R代码更有效?

问题描述 投票:-1回答:1

我有一个以下R代码,效率不高。我想使用Rcpp使其高效。特别是,我不习惯在Rcpp中处理数组。任何帮助,将不胜感激。

myfunc <- function(n=1600,
                   m=400,
                   p = 3,
                   time = runif(n,min=0.05,max=4),
                   qi21 = rnorm(n),
                   s0c = rnorm(n),
                   zc_min_ecox_multi = array(rnorm(n*n*p),dim=c(n,n,p)),
                   qi=matrix(0,n,n),
                   qi11 = rnorm(p),
                   iIc_mat = matrix(rnorm(p*p),p,p)){

            for (j in 1:n){
              u<-time[j]
              ind<-1*(u<=time)
              locu<-which(time==u)
              qi2<- sum(qi21*ind) /s0c[locu]

              for (i in 1:n){
                qi1<-  qi11%*%iIc_mat%*%matrix(zc_min_ecox_multi[i,j,],p,1)
                qi[i,j]<- -(qi1+qi2)/m

              }
            }

}

计算时间约为7.35秒。我需要一遍又一遍地调用此函数,大概20次。

system.time(myfunc())
   user  system elapsed 
   7.34    0.00    7.35
r rcpp
1个回答
0
投票

首先要做的是分析您的代码:profvis::profvis({myfunc()})

您可以做的是预先计算一次qi11 %*% iIc_mat。您得到了(有一些小的改进):

precomp <- qi11 %*% iIc_mat

for (j in 1:n) {
  u <- time[j]
  qi2<- sum(qi21[u <= time]) / s0c[time == u]

  for (i in 1:n){
    qi1 <- precomp %*% zc_min_ecox_multi[i, j, ]
    qi[i, j] <- -(qi1 + qi2) / m
  }
}

那是两倍的速度(8秒-> 4秒)。

然后将i循环向量化似乎很简单:

q1_all_i <- tcrossprod(zc_min_ecox_multi[, j, ], precomp)
qi[, j] <- -(q1_all_i + qi2) / m

(现在快了12倍)

© www.soinside.com 2019 - 2024. All rights reserved.