加速循环将数据分配给R中的矩阵

时间:2017-07-17 17:53:28

标签: r performance for-loop matrix

我正在模拟数据并使用R中的for循环填充矩阵。目前循环运行速度比我想要的慢。我已经做了一些工作来矢量化一些变量以提高循环速度,但它仍然需要一些时间。我相信

mat[j,year] <- sum(vec==1)/x

循环的一部分正在减慢速度。我已经更有效地研究了填充矩阵,但找不到任何可以帮助解决当前问题的东西。最终,这将被用作闪亮应用程序的一部分,因此我分配的所有变量都需要轻松分配不同的值。

任何有关加速循环或更有效地编写此循环的建议都将非常感激。

这是循环:

#These variables are all specified because they need to change with different simulations

num.sims <- 20 
time <- 50
mat <- matrix(nrow = num.sims, ncol = time)
x <- 1000
init <- 0.5*x  
vec <- vector(length = x)
ratio <- 1 
freq <- -0.4 
freq.vec <- numeric(nrow(mat))

## start a loop
for (j in 1:num.sims) {

vec[1:init] <- 1; vec[(init+1):x] <- 2
year <- 2

freq.vec[j] <- sum(vec==1)/x


for (i in 1:(x*(time-1))) {

freq.1 <- sum(vec==1)/x; freq.2 <- 1 - freq.1
fit.ratio <- exp(freq*(freq.1-0.5) + log(ratio))
Pr.1 <- fit.ratio*freq.1/(fit.ratio*freq.1 + freq.2)
vec[ceiling(x*runif(1))] <- sample(c(1,2), 1, prob=c(Pr.1,1-Pr.1))

## record data    
if (i %% x == 0) {
  mat[j,year] <- sum(vec==1)/x
  year <- year + 1
}}}

2 个答案:

答案 0 :(得分:0)

根据您需要调用此循环的频率,可能值得在C ++中重写它。 R是基于C ++构建的,任何C ++的运行速度都比甚至高效的R代码快很多倍。

sourceCpp是一个很好的软件包:https://www.rdocumentation.org/packages/Rcpp/versions/0.12.11/topics/sourceCpp

答案 1 :(得分:0)

内循环正在减慢你的速度。您正在进行x次迭代以更新矩阵中的每个单元格。由于每次修改vec的行程取决于之前的迭代,因此难以简化。 @Andrew Feierman可能是正确的,因为移动到C ++会受益,至少在if语句之前的四行。

或者,这只需要10-20秒即可运行。除非您要扩展或运行多次,否则加速它可能不值得。如果你保持原样,你可以在Shiny中设置一个进度条,让用户知道事情仍然有效。