這篇文章是關於使用Rcpp包加速R代碼以避免遞歸循環。使用Rcpp的R代碼的效率和速度
我的輸入是通過以下實施例(長度爲7),這是我使用了data.frame(長度51673)的一部分限定:
S=c(906.65,906.65,906.65,906.65,906.65,906.65,906.65)
T=c(0.1371253,0.1457896,0.1248953,0.1261278,0.1156931,0.0985253,0.1332596)
r=c(0.013975,0.013975,0.013975,0.013975,0.013975,0.013975,0.013975)
h=c(0.001332596,0.001248470,0.001251458,0.001242143,0.001257921,0.0,0.0)
P=c(3,1,5,2,1,4,2)
A= data.frame(S=S,T=T,r=r,h=h,P=P)
S T r h Per
1 906.65 0.1971253 0.013975 0.001332596 3
2 906.65 0.1971253 0.013975 0.001248470 1
3 906.65 0.1971253 0.013975 0.001251458 5
4 906.65 0.1971253 0.013975 0.001242143 2
5 906.65 0.1971253 0.013975 0.001257921 1
6 906.65 0.1971253 0.013975 0.0
7 906.65 0.1971253 0.013975 0.0
的參數是:
w=0.001; b=0.2; a=0.0154; c=0.0000052; neta=-0.70
我有功能的下面的代碼,我想用:
F<-function(x,w,b,a,c,neta,S,T,r,P){
u=1i*x
nu=(1/(neta^2))*(((1-2*neta)^(1/2))-1)
# Recursion back to time t
# Terminal condition for the A and B
A_Q=0
B_Q=0
steps<-round(T*250,0)
for (j in 1:steps){
A_Q= A_Q+ r*u + w*B_Q-(1/2)*log(1-2*a*(neta^4)*B_Q)
B_Q= b*B_Q+u*nu+ (1/neta^2)*(1-sqrt((1-2*a*(neta^4)*B_Q)*(1- 2*c*B_Q - 2*u*neta)))
}
F= exp(log(S)*u + A_Q + B_Q*h[P])
return(F)
}
S = A$S ; r= A$r ; T= A$T ; P=A$P; h= A$h
然後我想申請的前僱主用我在data.set的OU功能的長度的矢量N = 100000:
Z=length(S); N=100000 ; alpha=2 ; delta= 0.25
lambda=(2*pi)/(N*delta)
res = matrix(nrow=N, ncol=Z)
for (i in 1:N){
for (j in 1:Z){
res[i,j]= Re(F(((delta*(i-1))-(alpha+1)*1i),w,b,a,c,neta,S[j],T[j],r[j],P[j]))
}
}
但它服用大量的時間:它需要20秒來執行這行代碼對N = 100,但我想執行N = 100000次,整個運行時間可能需要幾小時。如何使用Rcpp微調上述代碼,減少執行時間並獲得高效的程序?
是否有可能減少執行時間,如果是這樣,請建議我一個解決方案,即使沒有Rcpp。
謝謝。其具有用於向量化的計算很大的支持 -
對於計算x =(((delta *(i-1)) - (alpha + 1)* 1i)其中1i是合理的,r中的複數的定義是,i取1到N之間的值 –