我想根据以下规则编写一个生成3 x 1
向量y
的代码(为简单起见选择了小数字):
此处x
是3 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
项。
我该如何编码?
答案 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