R中的双重/嵌套循环

时间:2018-12-20 18:12:01

标签: r loops for-loop matrix nested

我遇到了一个特殊的问题:我要做的是基于矩阵中的其他值来获取矩阵中的值,例如

     [,1]     [,2]     [,3]
[1,]  110   0.0000   0.0000
[2,]    0 300.3475   0.0000
[3,]    0   0.0000 820.0785

现在,我希望第一列的值一直到最后一行的值:

[1,1] = 110
[2,1] = [1,1] * const
[3,1] = [2,1] * const

在第二列:

[2,1] = 0
[2,2] = 300.3475
[3,2] = [2,2] * const

每列都相同。因此,关键是要从[i,i]获得值,将其乘以const并放入[i + 1,i],然后将该值乘以const并放入[i + 2,i]。每个列的步骤相同。因此,上面显示的矩阵将像这样(const = 0.36624):

     [,1]     [,2]     [,3]
[1,] 110.00000   0.0000   0.0000
[2,]  40.28666 300.3475   0.0000
[3,]  14.75468 110.0000 820.0785

我想出了类似这样的东西:

N <- 2
M.dim <- N+1
d <- 0.36624 #const
S0 <- c(110, 320, 820.075) #but length of this vector equals M.dim it's just example)
bin.mat <- matrix(rep(0), M.dim, M.dim)

for(i in 1:M.dim){
  for(j in i:N){
    bin.mat[i,i] <- S0[i]
    bin.mat[j + 1, i] <- bin.mat[j, i] * d
  }
}

现在,它正在工作-但显示错误:

Error in `[<-`(`*tmp*`, j + 1, i, value = bin.mat[j, i] * d) : 
  subscript out of bounds

说实话,我不知道为什么。可能是因为我不太了解这个循环的工作原理,所以我只是尝试了它的maaaaaany变体,而这是我实际想要做的唯一一个:D并且尽管其他基于此矩阵的计算均不正确,但我怀疑只要因为它适用于少量的列或行,所以可能不适用于较大的列或行。

2 个答案:

答案 0 :(得分:1)

使用applycumprod的另一种方法

const <- 0.36624
mat[lower.tri(mat)] <- const
mat[upper.tri(mat)] <- 1

out <- apply(mat, 2, cumprod)
out[upper.tri(out)] <- 0
out
#          [,1]     [,2]     [,3]
#[1,] 110.00000   0.0000   0.0000
#[2,]  40.28640 300.3475   0.0000
#[3,]  14.75449 109.9993 820.0785

这个想法是用0代替下部三角形中的const,用1替代上部三角形中的值,然后在每列上应用cumprod

数据

mat <- structure(c(110, 0, 0, 0, 300.3475, 0, 0, 0, 820.0785), .Dim = c(3L, 
3L), .Dimnames = list(NULL, NULL))

答案 1 :(得分:0)

本质上,问题在于3:2是向量c(3,2)。因此,当i = 3尝试bin.mat[j+1,i]时,您会越界。这是一个修复程序(保持循环)

for(i in 1:M.dim){
  bin.mat[i,i] <- S0[i]
  if (i >= 3) next # or i > N works as well
  for(j in i:N){
    bin.mat[j + 1, i] <- bin.mat[j, i] * d
  }
}
bin.mat
# returns
          [,1]     [,2]    [,3]
[1,] 110.00000   0.0000   0.000
[2,]  40.28640 320.0000   0.000
[3,]  14.75449 117.1968 820.075