循环中的术语包含它们的总和

时间:2018-04-13 13:26:13

标签: r loops

我想根据以下规则编写一个生成3 x 1向量y的代码(为简单起见选择了小数字):

enter image description here

此处x3 x 1向量。根据规则,对于y的更新,我需要所有y的总和。

尝试使用任意x

进行编码
x <- c(2,3,1)
y <- c(0,0,0)

for(i in 1:5){
  for(j in 1:3){
    y[j] <- x[j] + y[j] + sum(y)
  }
}

此代码不合适,因为它按术语计算sum(b)个字词。 内部循环表示如下:

y[1] = x[1] + 0 = 2
y[2] = x[2] + 2 = 5
y[3] = x[3] + 2 + 5 = 8

这是不合适的,因为sum(y)字词包含y[1]的一个字词,y[2]的两个字词,y[3]的三个字词。但根据上面给出的规则,我认为sum(y)对于每次迭代2 + 5 + 8 = 15应为y[1], y[2], y[3]。此外,该过程应重复一定时间(这里外循环显示5次)。在外循环的每个时间,对于内循环的所有三次迭代,将仅计算一个sum(y)项,并且对于每个sum(y),它将被设为j项。

我该如何编码?

2 个答案:

答案 0 :(得分:2)

你过于复杂了。将内环向量化:

> x <- c(2,3,1)
> y <- c(0,0,0)
> for(j in 1:5) y <- x + y + sum(y)
> y
[1] 682 687 677

这种方法每次迭代只计算一次sum(y),这就是你想要的。另外一个好处是,在单个操作中添加向量要比在循环中按组件方式添加向量快得多。

答案 1 :(得分:1)

也许这会起作用

myfun <- function(x, y, i) {
    y[i] <- x[i] + sum(y)
    if (i < length(x)) {
        myfun(x, y, i+1)
    } else {
        return(y)
    }
}

x <- c(2, 3, 1)
y <- rep(0, length(x))
myfun(x, y, 1)
# [1] 2 5 8

x <- c(2, 3, 1, 5)
y <- rep(0, length(x))
myfun(x, y, 1)
# [1] 2 5 8 20