在 forloop 期间为矩阵的给定行中的每个值设置 limit/threshold

setting a limit/threshold for each value in a given row(s) of a matrix during a forloop

我有一个用于在 r 中投影矩阵的 for 循环,我想在给定行的值上设置一个“上限”或上限 limit/threshold,这样它们就不会超过这个值。下面是一个示例代码,我已经注释掉了我在 forloop 中的尝试。目标是第三行中的任何迭代 results/results 在任何时候都不会超过 10000,如果超过,它们将变为 10000。在此先感谢您的帮助。

set.seed(123)
A <- lapply(1:50, function(x)  # construct list of matrices
  matrix(c(0, 0, 10,
           rbeta(1,5,4), 0, 0,
           0, rbeta(1,10,2), 0), nrow = 3,ncol=3, byrow = TRUE, ))

n <- c(1000,100,10)  # initial vector of abundances

nYears = 50  # define the number of years to project over

allYears <- matrix(0,nrow=3,ncol=nYears+1)  # build a storage array for all abundances

allYears[,1] <- n  # set the year 0 abundance   

i1 <- 2:ncol(allYears)

for(t in seq_along(i1)) {
  #ifelse (allYears[3,i1[t]-1] > 10000,10000,allYears[3,i1[t]-1])
  allYears[,i1[t]] <-  A[[t]] %*% allYears[,i1[t]-1]
}

希望我清楚地理解你的问题。 因此,您试图将第三行的值限制为某个阈值。 我想你的代码就差不多了。

在您决定是否通过 ifelse 对某一特定条目设置限制后, 您希望将(更新的)值保存到输出矩阵 allYears。 因此, 你可以得到你想要的矩阵。

set.seed(123)
A <- lapply(1:50, function(x)  # construct list of matrices
  matrix(c(0, 0, 10,
           rbeta(1,5,4), 0, 0,
           0, rbeta(1,10,2), 0), nrow = 3,ncol=3, byrow = TRUE, ))

n <- c(1000,100,10)  # initial vector of abundances

nYears = 50  # define the number of years to project over

allYears <- matrix(0,nrow=3,ncol=nYears+1)  # build a storage array for all abundances

allYears[,1] <- n  # set the year 0 abundance   

i1 <- 2:ncol(allYears)

for(t in seq_along(i1)) {
  allYears[,i1[t]] <-  A[[t]] %*% allYears[,i1[t]-1]

  ### Check and update the entry for the output matrix ###
  allYears[3,i1[t]] <- ifelse (allYears[3,i1[t]] > 10000, 10000, allYears[3,i1[t]])
}

reprex package (v2.0.1)

于 2022-01-25 创建