我有一个向量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
我将不胜感激有关如何在不使用循环的情况下解决此问题的提示。
我有一个向量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
我将不胜感激有关如何在不使用循环的情况下解决此问题的提示。
通常,如果没有显式循环,您将无法执行此操作。在这种特定情况下,您可以使用以下提供的隐式循环cumprod
:
a <- rep(2, 10)
a[1] <- 1
cumprod(a)
# [1] 1 2 4 8 16 32 64 128 256 512
对于形式的一般递归系列:
y[i] = x[i] + f[1]*y[i-1] + ... + f[p]*y[i-p]
您可以使用该filter
功能。在您的情况下,您有x[i] = 0
和for 。这转化为: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^(0:9)
# [1] 1 2 4 8 16 32 64 128 256 512
你可能还想写
2^seq(from=0, to=9)
对于长向量,我很确定@JoshuaUlrich 的方法会快得多,但这个方法肯定非常紧凑。你还说你不是特别关心速度。