使用 Rcpp 将代码从 R 转换为 C++ 不返回任何结果

问题描述 投票:0回答:1

我在使用向量方面取得了成功,但我知道我可以使用 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

你能告诉我哪里出了问题吗?

r loops rcpp
1个回答
0
投票

您的

sample
包含双精度值,当您将它们传递给 C++ 函数时,它们会被强制转换为整数。
as.integer(0.01)
返回
0L
。将
IntegerMatrix
替换为
NumericMatrix
unique(c(teste))
将返回
[1] 0.01  NaN
。我认为这仍然不是预期的结果,但请您进一步调试。

© www.soinside.com 2019 - 2024. All rights reserved.