簡體   English   中英

下標越界,有界隨機游走的迭代

[英]Subscript out of bounds, iteration for a bound random walk

我正在嘗試編寫一個 function 生成由單位球體約束的隨機游走,從而導致由向量給出的隨機游走的最后位置。 在試圖找出我的 function 壞在哪里時,我試着像這樣拼湊出來:

norm_vec <- function(x) sqrt(sum(x^2))
sphere_start_checker <- function() {
        repeat {
        start_loc <- runif(3, min = -1, max = 1)
        if (norm_vec(start_loc) < 1) return(start_loc)
        }
}

n <- 10
set.seed(1)
new_loc <- as.matrix(t(sphere_start_checker()))
temp_loc <- as.matrix(t(c(0, 0, 0)))
for(i in n) {
repeat {
        temp_loc <- new_loc[i, ] + runif(3, min = -.01, max = .01)
        if (norm_vec(temp_loc) < 1) {
                return(new_loc <- rbind(new_loc, temp_loc))
        }
}
}
new_loc

我收到錯誤:new_loc[i, ] 中的錯誤:下標越界

但是,當我在 for 循環之外手動迭代代碼時,一切正常。 我認為這與 R 的范圍規則有關,並且我嘗試將 rbind 的結果分配給全局環境,但這不起作用。

最初,我嘗試像這樣編寫 function:

randomwalk_sphere <- function(n, radius, stepmax) {
        # initialize sphere bounds
        sphere_radius <- as.double(radius)
        # initialize random starting vector
        # while loop that adds a random vector to our start_loc n times, repeating once boundary condition is met
        loop <- 0
        new_loc <- sphere_start_checker()
        while(loop <= n) {
                repeat {
                        temp_loc <- new_loc + runif(3, min = -stepmax, max = stepmax)
                        if (norm_vec(temp_loc) < sphere_radius) {
                                return(assign("new_loc", temp_loc, env = .GlobalEnv))
                        } 
                }
                loop <- loop + 1
        }
        new_loc
}

但是當我這樣做時,while 循環似乎不起作用,我只是從均勻分布而不是從隨機游走中獲得初始 new_loc 坐標。 我意識到使用 rbind 可能是一種更正確的方法,但我有興趣了解為什么這種方法不起作用。

一些想法:

  • 當您使用for (i in n) “修復”問題時,規范(更常見)方法通常是將n保留為單長度計數,並在for調用中使用seq_len(n)或類似方法,例如n <- 10; for (i in seq_len(n)) n <- 10; for (i in seq_len(n))

  • 除了正式的return function(.){..}聲明以外的任何東西都是不正確的; 如果要停止repeat ,請使用break 如此處所示,重新分配的 scope 是不正確的,因此new_loc永遠不會真正重新分配所有迭代的結果。

最終,一旦你停止嘗試從非函數return ,它就會起作用。

n <- 10
set.seed(1)
new_loc <- as.matrix(t(sphere_start_checker()))
temp_loc <- as.matrix(t(c(0, 0, 0)))
for (i in seq_len(n)) {
  repeat {
    temp_loc <- new_loc[i, ] + runif(3, min = -.01, max = .01)
    if (norm_vec(temp_loc) < 1) {
      new_loc <- rbind(new_loc, temp_loc)
      break
    }
  }
}
new_loc
#                [,1]       [,2]      [,3]
#          -0.4689827 -0.2557522 0.1457067
# temp_loc -0.4608185 -0.2617186 0.1536745
# temp_loc -0.4519250 -0.2585026 0.1562568
# temp_loc -0.4606893 -0.2643831 0.1497879
# temp_loc -0.4569488 -0.2667010 0.1551848
# temp_loc -0.4569948 -0.2623487 0.1650229
# temp_loc -0.4593941 -0.2567998 0.1737170
# temp_loc -0.4651513 -0.2537663 0.1662281
# temp_loc -0.4698069 -0.2560440 0.1564959
# temp_loc -0.4721591 -0.2486502 0.1533029
# temp_loc -0.4725175 -0.2466589 0.1531737

暫無
暫無

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

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