2016-03-31 50 views
1

Temperlenmiş fraksiyonel farklılığın bu yaklaştırılmasını hızlandırmaya çalışıyorum. Bu, bir zaman dizisinin uzun/yarı uzun belleğini kontrol eder. İlk döngü için yinelemeli olduğu düşünüldüğünde, onu nasıl simüle edeceğini bilmiyorum. Ayrıca, denenen vektörleştirmenin çıktısı değiştirilmemiş ham koddan biraz uzaktır. Yardımın için teşekkürler.Temperlenmiş fraksiyonel farklılaşma hesaplamasının vektöreleştirilmesi

Ham Kod

tempfracdiff= function (x,d,eta) { 

n=length(x);x=x-mean(x);PI=numeric(n) 
PI[1]=-d;TPI=numeric(n);ydiff=x 

for (k in 2:n) {PI[k]=PI[k-1]*(k-1-d)/k} 
for (j in 1:n) {TPI[j]=exp(-eta*j)*PI[j]} 
for (i in 2:n) {ydiff[i]=x[i]+sum(TPI[1:(i-1)]*x[(i-1):1])} 
return(ydiff)     } 

teşebbüs Vektoriyal

tempfracdiffFL=function (x,d,eta) { 

n=length(x);x=x-mean(x);PI=numeric(n) 
PI[1]=-d;TPI=numeric(n);ydiff=x 

for (k in 2:n) {PI[k]=PI[k-1]*(k-1-d)/k} 
TPI[1:n]=exp(-eta*1:n)*PI[1:n] 
ydiff[2:n]=x[2:n]+sum(TPI[1:(2:n-1)]*x[(2:n-1):1]) 
return(ydiff)   } 

cevap

2

PI için kullanabileceğiniz cumprod:

k <- 1:n 
PI <- cumprod((k-1-d)/k) 

TPE endeksleri olmadan dile edilebilir:

Yani

ydiff <- x+c(0,convolve(x,rev(TPI),type="o")[1:n-1]) 

hepsini bir araya koyarak:

Ve ydiffx artı x evrişim ve TPI olduğunu

mytempfracdiff = function (x,d,eta) { 
    n <- length(x) 
    x <- x-mean(x) 
    k <- 1:n 
    PI <- cumprod((k-1-d)/k) 
    TPI <- exp(-eta*k)*PI 
    x+c(0,convolve(x,rev(TPI),type="o")[1:n-1]) 
} 

Test durumda örnek

set.seed(1) 
x <- rnorm(100) 
d <- 0.1 
eta <- 0.5 

all.equal(mytempfracdiff(x,d,eta), tempfracdiff(x,d,eta)) 
# [1] TRUE 

library(microbenchmark) 
microbenchmark(mytempfracdiff(x,d,eta), tempfracdiff(x,d,eta)) 
 
    Unit: microseconds 
          expr  min  lq  mean median  uq 
    mytempfracdiff(x, d, eta) 186.220 198.0025 211.9254 207.473 219.944 
     tempfracdiff(x, d, eta) 961.617 978.5710 1117.8803 1011.257 1061.816 
      max neval 
     302.548 100 
    3556.270 100 
1

PI [k] için, Reduce yararlı

n <- 5; d <- .3 
fun <- function(a,b) a * (b-1-d)/b 
Reduce(fun, c(1,1:n), accumulate = T)[-1] # Eliminates PI[0] 

[1] -0.30000000 -0.10500000 -0.05950000 -0.04016250 -0.02972025