벡터가 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
루프를 사용하지 않고이 문제를 해결할 수있는 방법에 대한 힌트를 주신 데 대해 감사드립니다.
일반적으로 명시적인 루프가 없으면이 작업을 수행 할 수 없습니다. 아주 간단하게
a <- rep(2, 10)
a[1] <- 1
cumprod(a)
# [1] 1 2 4 8 16 32 64 128 256 512
아마도'cumprod()'가'.Primitive()'이후 훨씬 더 빠르다는 것에 주목할 가치가 있습니다 ... 내 테스트 결과 네이티브'for 루프'보다 약 4 배 빠르다고 나타났습니다. 두 함수 모두'컴파일러'패키지의'cmpfun()'함수를 사용합니다. +1 – Chase
지수 함수 ^
가 벡터화되어 있으므로 :이 특정한 경우에, 당신은 암시 적 cumprod
에서 제공하는 루프를 사용할 수 있습니다 당신은 또한
2^(0:9)
# [1] 1 2 4 8 16 32 64 128 256 512
2^seq(from=0, to=9)
긴 벡터의 경우 @ JoshuaUlrich의 방법이 훨씬 빠를 것이라고 확신하지만이 것은 확실히 매우 컴팩트합니다. 속도에 대해 특별히 염려하지 않는다고하셨습니다. 형태의 일반적인 재귀 시리즈
는 :
y[i] = x[i] + f[1]*y[i-1] + ... + f[p]*y[i-p]
당신은 filter
기능을 사용할 수 있습니다. 귀하의 경우 x[i] = 0
, 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
은 매우 강력하고 효율적이다. 하지만 여기에 기하학적 인 경우에는 과도한 행동 일 수 있습니다.
일반적인 경우 필터를 일반화하면 어떻게됩니까? –
일반적으로 재귀를 벡터화하는 것은 어렵습니다. 아이디어를 보려면 여기를 참조하십시오 : http://stackoverflow.com/questions/7153586/can-i-vectorize-a-calculation-which-depends-on-previous-elements 루프를 피하려는 이유를 설명 할 수 있다면 도움이 될 것입니다. (속도?) 그리고 이것이 실제 문제인 경우 (문제가 완전히 재귀를 피하기 위해 다시 생각할 수 있기 때문에) 해결하고 싶습니다. –
댓글과 링크를 제공해 주셔서 감사합니다. 속도는 실제로 문제가되지 않습니다. 그것은 호기심의 문제입니다. 나는 그것에 대해 얼마 동안 생각해 왔고 그것을 vectorize하는 것이 없는지 궁금해하고 있었다. – johannes