ベクトルがあり、ループを使用せずに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
とf[1] = 2
forf[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の方法の方がはるかに高速であると確信していますが、これは確かに非常にコンパクトです。また、速度については特に気にしていないとおっしゃいました。