2012-05-01 2 views
2

벡터가 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 

루프를 사용하지 않고이 문제를 해결할 수있는 방법에 대한 힌트를 주신 데 대해 감사드립니다.

+1

일반적으로 재귀를 벡터화하는 것은 어렵습니다. 아이디어를 보려면 여기를 참조하십시오 : http://stackoverflow.com/questions/7153586/can-i-vectorize-a-calculation-which-depends-on-previous-elements 루프를 피하려는 이유를 설명 할 수 있다면 도움이 될 것입니다. (속도?) 그리고 이것이 실제 문제인 경우 (문제가 완전히 재귀를 피하기 위해 다시 생각할 수 있기 때문에) 해결하고 싶습니다. –

+0

댓글과 링크를 제공해 주셔서 감사합니다. 속도는 실제로 문제가되지 않습니다. 그것은 호기심의 문제입니다. 나는 그것에 대해 얼마 동안 생각해 왔고 그것을 vectorize하는 것이 없는지 궁금해하고 있었다. – johannes

답변

5

일반적으로 명시적인 루프가 없으면이 작업을 수행 할 수 없습니다. 아주 간단하게

a <- rep(2, 10) 
a[1] <- 1 
cumprod(a) 
# [1] 1 2 4 8 16 32 64 128 256 512 
+0

아마도'cumprod()'가'.Primitive()'이후 훨씬 더 빠르다는 것에 주목할 가치가 있습니다 ... 내 테스트 결과 네이티브'for 루프'보다 약 4 배 빠르다고 나타났습니다. 두 함수 모두'컴파일러'패키지의'cmpfun()'함수를 사용합니다. +1 – Chase

3

지수 함수 ^가 벡터화되어 있으므로 :이 특정한 경우에, 당신은 암시 적 cumprod에서 제공하는 루프를 사용할 수 있습니다 당신은 또한

를 작성 할 수 있습니다

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

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

긴 벡터의 경우 @ JoshuaUlrich의 방법이 훨씬 빠를 것이라고 확신하지만이 것은 확실히 매우 컴팩트합니다. 속도에 대해 특별히 염려하지 않는다고하셨습니다. 형태의 일반적인 재귀 시리즈

4

는 :

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

당신은 filter 기능을 사용할 수 있습니다. 귀하의 경우 x[i] = 0, 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은 매우 강력하고 효율적이다. 하지만 여기에 기하학적 인 경우에는 과도한 행동 일 수 있습니다.

+0

일반적인 경우 필터를 일반화하면 어떻게됩니까? –