2017-07-17 38 views
0

我正在模擬數據並在R中使用for循環填充矩陣。目前循環運行速度比我想要的要慢。我已經做了一些工作來向量化一些變量來提高循環速度,但它仍然需要一些時間。我相信加速循環分配數據到矩陣R中

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 
}}} 

回答

0

內環是什麼放慢你失望。你正在做x迭代次數來更新矩陣中的每個單元格。由於每次修改vec取決於以前的迭代,因此這將很難簡化。 @Andrew Feierman可能是正確的,這將從移植到C++中獲益,至少在if聲明之前的四行。

或者,這隻需要10-20秒即可運行。除非你要擴展或多次運行它,否則加速它可能不值得麻煩。如果保持原樣,可以在Shiny中放置一個進度條,讓用戶知道事情仍然有效。