簡體   English   中英

泊松分布函數無限循環

[英]Poisson Distribution Function infinite loop

我有以下代碼試圖模擬金屬原子在冷基板上的沉積; 但是,它以無限循環運行。

有人可以看到我在哪里犯錯嗎?

l <- 20
n <- 2000
e <- 1000
lsize <- matrix(0,l,l)
deposits <- rep(0,n)
avg.deposits <- rep(0,n)
prob <- rep(0,n)
n.deposits <- rep(0,n)
for(m in 1:e){
  for(j in 1:l){
    for(k in 1:l){
      lsize[j,k] <- 0
    }
  }
  for(i in 1:n){
    ra <- runif(1)
    x <- floor(1+l*ra)
    ra <- runif(1)
    y <- floor(1+l*ra)
    lsize[x,y] <- lsize[x,y]+1
    s <- 0
    for(j in 1:l){
      for(k in 1:l){
        if(lsize[j,k] <- 1){
          s <- s+1
        }
      }
    }
    n.deposits[i] <- n.deposits[i]+s
  }
}
for(i in 1:n){
  avg.deposits[i] <- n.deposits[i]/e
  prob[i] <- avg.deposits[i]/(l*l)
  deposits[i] <- i
}
plot(deposits, prob)

沒有無限循環問題。

這很容易檢查是否繼續使用較小的lne參數運行代碼。 當增加任何提及的參數時,您的代碼將進行次優縮放(在這種情況下為超線性)。

明顯點:

  1. 預分配矩陣。 不要在每個循環中一次又一次地分配lsize
  2. 限制您的函數調用; 在這種情況下為runif() 您不必調用同一函數數千次。 在循環外調用一次以生成所需的隨機數,然后在循環內調用行中的下一個元素。
  3. 使用printcat語句打印出您使用的循環計數器。 嘗試使用較小的值,以確保他們編程的內容可以滿足您的要求,然后將計數器設置為數千。
  4. 希望在可能的情況下向量化您的代碼。 例如。 如果a = runif(100)'和要設置所有的實例,其中a < 0.5至等於4沒有理由遍歷的所有元素a順序。 a[ a < 0.5] = 4就足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM