Это сообщение об ускорении R-кода с использованием пакета Rcpp, чтобы избежать рекурсивных циклов.Эффективность и скорость R-кода с использованием Rcpp
Мой вход определяют на следующем примере (длина 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 вектора длины 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, ane i принимает значения от 1 до N –