我有一个向量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
对于如何在不使用循环的情况下解决这个问题,我将不胜感激。
答案 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] = 0
有f[1] = 2
,f[i] = 0
和i > 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的方法会快得多,但这个方法肯定非常紧凑。你还说你并不特别关心速度。