如何获得此嵌套for循环以正确工作?
问题描述:
我正在尝试创建一个模拟场景,我在这里观看森林生长200年。我的森林里有25棵树。目标是每棵树的生物量为1,然后每年保持活力,每年生物量达到600。如果它死了,它会回复到0生物量。我现在遇到的问题是,我的树木都模仿对方,它们不是单独生长。任何帮助表示赞赏。我在Windows 7如何获得此嵌套for循环以正确工作?
simulation_years = 200
num_trees_side1 = 5
num_trees_side2 = 5
npp=600
mortality=0.02
forest = array(0,dim=c(simulation_years,num_trees_side1,num_trees_side2))
forest[1,,] = 1
for(i in 2:simulation_years){
for(j in 1:num_trees_side1){
for(k in 1:num_trees_side2){
forest[i,,] = forest[i] + npp
rvar = runif(1,0,1)
if(rvar < mortality){
forest[i,,] = 0} }}}
答
运行v 3.2.1版本你的问题在这里forest[i,,]=0
- 您重置整个“面”为0,每当有一个死亡事件。这应该是forest[i,j,k] = 0
。
此外,您并不需要所有这些for
循环。您的问题只能在一个维度上真正递归 - 时间 - 另外两个维度可以一次处理。以下是我愿意做你的问题:通过与simulation_years=2
为例
num_trees = num_trees_side1 * num_trees_side2
for(i in 2:simulation_years){
deaths=matrix(runif(num_trees)>mortality,
ncol=num_trees_side2)
forest[i,,] = deaths*(forest[i-1L,,]+
npp*(forest[i-1L,,]>0))
}
让我们的工作。
set.seed(10239) #so we both get the same random numbers
后,我们运行上面的代码中,我们可以看到哪些树通过查看deaths
死亡:
> deaths
[,1] [,2] [,3] [,4] [,5]
[1,] TRUE TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE TRUE
[4,] TRUE TRUE TRUE TRUE TRUE
[5,] FALSE TRUE TRUE FALSE TRUE
因此,在[5,1]
和[5,4]
树木已经死亡。让我们来看看生物质通过查看forest[2,,]
:
> forest[2,,]
[,1] [,2] [,3] [,4] [,5]
[1,] 601 601 601 601 601
[2,] 601 601 601 601 601
[3,] 601 601 601 601 601
[4,] 601 601 601 601 601
[5,] 0 601 601 0 601
根据需要,在[5,1]
和[5,4]
两棵树已经死了;其余的都增长了600.
非常感谢。我可能没有说得很清楚的唯一的其他事情是,如果一棵树没有死亡,那么到了第三年,它应该增长到1201,然后是1801等。 –
@pop_pop_pop是的,这是通过我的方法处理的。一旦最后一件事 - 一旦一棵树死了,它永远是死的,对吗?如果是这样,请参阅我的编辑,否则原始版本是正确的。 – MichaelChirico