我在使用向量方面取得了成功,但我知道我可以使用 C++ 来增强我的模拟以获得更高的水平。
下面是 R 中运行良好的原始 for 循环:
library(plyr)
library(dplyr)
library(tidyverse)
library(DT)
library(Rcpp)
library(scales)
Mandela <- rpois(2000000, 0.01)
mean <- mean(Mandela)
sigma <- sd(Mandela)
#colocar distribui??o para adquirir par?metros
paths <- 100000
count<-12*30
interval<-12/count
sample <- matrix(0,nrow=(count+1),ncol=paths)
sample[1,]<- 0.01
rnormm <- as.matrix(sapply(1:(count+1), function(x) rnorm(1, mean = 0, sd = 1)))
t0 <- Sys.time()
for(i in 1:paths) {
for(j in 2:(count+1))
{
sample[j,i]<-sample[j-1,i]*exp(interval*(mean-((sigma)^2)/2)+((interval)^.5)*rnormm[j-1,1]*sigma) #Expression for Geometric Brownian Motion
}
}
t1 <- Sys.time()
tempoatual <- t1-t0
这个块返回我实际需要进行微积分的矩阵。
但是当我使用
Rcpp
将其转换为 C++ 时,我的尝试结果失败,没有返回任何值。
cppFunction(
"IntegerMatrix proc(IntegerMatrix x, IntegerMatrix random, int media, int variancia, int intervalo) {
const int n = x.nrow();
const int m = x.ncol();
const int mean = media;
const int sigma = variancia;
const int interval = intervalo;
IntegerMatrix y(n,m);
IntegerMatrix z(random.nrow(),1);
y = x;
z = random;
for (int j=0; j < m; j++) {
for (int i=1; i < n; i++) {
y(i,j) = y(i-1,j) * exp(interval*(mean-((sigma)^2)/2)+((interval)^(1/2))*z(i-1,1)*sigma);
}
}
return y;
}")
tempoatual <- t1-t0
t0 <- Sys.time()
teste <- proc(x = sample,random = rnormm,media = mean,variancia = sigma,intervalo = interval)
t1 <- Sys.time()
tempoRCPP <- t1-t0
你能告诉我哪里出了问题吗?
您的
sample
包含双精度值,当您将它们传递给 C++ 函数时,它们会被强制转换为整数。 as.integer(0.01)
返回 0L
。将 IntegerMatrix
替换为 NumericMatrix
,unique(c(teste))
将返回 [1] 0.01 NaN
。我认为这仍然不是预期的结果,但请您进一步调试。