向量元素的递归操作

时间:2012-05-01 13:48:40

标签: r

我有一个向量a,并希望将每个元素递归地与b相乘,而不使用循环。

a <- rep(0, 10)
a[1] <- 1
b <- 2

# with a loop
for (i in 2:length(a)) a[i] <- a[i-1] * b

对于如何在不使用循环的情况下解决这个问题,我将不胜感激。

3 个答案:

答案 0 :(得分:5)

通常,如果没有显式循环,则无法执行此操作。在这种特定情况下,您可以使用cumprod提供的隐式循环:

a <- rep(2, 10)
a[1] <- 1
cumprod(a)
#  [1]   1   2   4   8  16  32  64 128 256 512

答案 1 :(得分:5)

对于表格的一般递归系列:

y[i] = x[i] + f[1]*y[i-1] + ... + f[p]*y[i-p]

您可以使用filter功能。在您的情况下,x[i] = 0f[1] = 2f[i] = 0i > 1。这转化为:

filter(rep(0,10), 2, method="recursive", init=1/2)
# Time Series:
# Start = 1 
# End = 10 
# Frequency = 1 
#  [1]   1   2   4   8  16  32  64 128 256 512

在您学习如何使用它之后,第一次filter非常强大且高效。但也许这对你的几何情况来说太过分了。

答案 2 :(得分:3)

指数函数^是矢量化的,非常简单:

2^(0:9)
# [1]   1   2   4   8  16  32  64 128 256 512

您可能还想写

2^seq(from=0, to=9)

对于长矢量,我很确定@ JoshuaUlrich的方法会快得多,但这个方法肯定非常紧凑。你还说你并不特别关心速度。