4

我有一个向量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

我将不胜感激有关如何在不使用循环的情况下解决此问题的提示。

4

3 回答 3

5

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

a <- rep(2, 10)
a[1] <- 1
cumprod(a)
#  [1]   1   2   4   8  16  32  64 128 256 512
于 2012-05-01T14:25:51.603 回答
5

对于形式的一般递归系列:

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

您可以使用该filter功能。在您的情况下,您有x[i] = 0和for 。这转化为:f[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它非常强大和高效。但是,对于您的几何案例来说,这可能是矫枉过正。

于 2012-05-02T00:21:05.377 回答
3

指数函数^是矢量化的,所以很简单:

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

你可能还想写

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

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

于 2012-05-01T23:57:39.197 回答