-5

我得到了向量的两个第一个值。我想从前两个向量中计算下一个向量值。就像您在 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
> 

我想在计算当前值时使用向量的先前值,但不是我刚刚做的那样。

4

2 回答 2

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在内部使用 which 循环),因此这不太符合“无循环”要求。即使我们手动输入 'genfun(1) ,genfun(2) ,genfun(3)', ... 即使不强制计算机循环,我们也在使用湿件循环,所以我不知道这是否重要.

就个人而言,循环对我来说似乎是更简单的选择。如果您预先分配整个向量并编写一个有效的循环,那么循环可能不会比其他方法慢。

编辑

实际上,您也可以使用递归函数来执行此操作(并存储所有中间计算)。我不确定这是否会被认为是“没有循环”。无论哪种方式,我都希望它比简单的循环更复杂和更慢。

于 2013-01-30T20:43:33.127 回答
1

我写这个作为答案,因为我认为你的问题“是否可能”的答案是“不”。

据我所知,如果没有循环(至少在后台),这是不可能的,因为您需要为每个连续步骤重新轮询新值。在 Excel 中,我知道您所指的“自动填充”选项,它在后台循环。

即使在“嵌入”函数中使用计算滞后,每次更新前一个值时,您仍然必须再次调用该函数。正如我所看到的,你想要做的逻辑基本上是一个循环,除非你想手工编写每一行。我不知道任何适合您的矢量化方法,因为矢量化语句必须一次完成所有工作。

于 2013-01-30T19:55:31.647 回答