我给了两个第一个矢量值。我想从前两个计算向量的下一个值。它就像你在excel中所做的那样:用数字填充前两个单元格,在第三个单元格中写入公式,然后将其应用于更多单元格。但是,我想在没有循环的情况下这样做。
我想做的事情:
x = c()
x[1] = 1
x[2] = 2
for (i in 3:10)
x[i] = 2*x[i-1] - 0.5*x[i-2]
x
> x
[1] 1.0000 2.0000 3.5000 6.0000 10.2500 17.5000 29.8750 51.0000
[9] 87.0625 148.6250
>
我想在计算当前值时使用矢量的先前值,但不是我刚才的方式。
答案 0 :(得分:4)
你可以找到系列的第i个元素,而不像这样循环:
roots <- polyroot( c(0.5, -2, 1) )
roots <- Re(roots)
k <- solve( rbind( 1, roots ), c(1,2) )
genfun <- function(n) {
as.vector(k %*% roots^(n-1))
}
genfun(1)
genfun(2)
genfun(3)
genfun(4)
如果我们执行以下操作,则更容易与循环进行比较:
genfun2 <- Vectorize(genfun)
genfun2( 1:10 )
然而,虽然没有使用显式循环,但循环有几种用法(:
使用内部循环,然后mapply
在内部使用,循环也是如此),所以这不太符合“否循环“要求。即使我们手工输入'genfun(1),
genfun(2),
genfun(3)`,...然后我们正在使用wetware循环,即使不强制计算机循环,所以我不知道这是否重要。
就个人而言,循环似乎对我来说更简单。如果你预先分配整个向量并编写一个有效的循环,那么循环可能不会比其他方法慢。
修改强>
实际上你也可以使用递归函数(并存储所有中间计算)来做到这一点。我不确定这是否会被认为是“没有循环”。无论哪种方式,我都希望它比简单的循环更复杂,更慢。
答案 1 :(得分:1)
我写这个作为答案,因为我认为你的问题的答案“是否有可能”是“不”。
据我所知,如果没有循环(至少在后台),这是不可能的,因为你需要为每个连续步骤重新轮询新值。在Excel中,我知道您所指的“自动填充”选项,它在后台循环。
即使使用“嵌入”功能中的计算延迟,每次更新上一个值时仍需要再次调用该函数。在我看来,你想要做的逻辑基本上是一个循环,除非你想手工编写每一行。我不知道任何适合你的矢量化方法,因为矢量化语句必须立即完成所有工作。