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] = 0f[1] = 2forf[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非常に強力で効率的です。しかし、ここでの幾何学的なケースではやり過ぎかもしれません。

于 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 に答える