c++ - 使用 "long"输入时 Rcpp 函数使 R 崩溃

标签 c++ r rcpp

我有一个用于线性插值的 C++ 函数,我正在使用 Rcpp 运行该函数,当我使用不太“长”的初始 vector 进行插值时,该函数可以正常工作,但是当我将初始 vector 的大小增加了三倍,该函数在循环中运行良好,但是当我决定使用相同的输入循环该函数时,Rstudio 崩溃了。我看了看 r aborted when using rcppR crashes when calling a Rcpp function in a loop但我只是没有找到任何对我的问题有帮助的解决方案。

这是 C++ 函数:

double  InterpolacionRAWCpp(NumericVector plazos,NumericVector tasas,double plazoRequerido){

  double interpolacionRAW,a,p1,p2;
  int numero_plazo;
  double ayuda_plazo = plazoRequerido;
  NumericVector tn(tasas.size()+1);
  NumericVector pn(tasas.size()+1);
  tn[0] = tasas[0];
  pn[0] = 0;
  tn[Rcpp::Range(1,tn.size())] = tasas;
  pn[Rcpp::Range(1,pn.size())] = plazos;
  interpolacionRAW = 0;
  numero_plazo = tasas.size();
  if(ayuda_plazo==0){
    interpolacionRAW=tn[0];
  } else {
    for(int i =0; i<numero_plazo;++i){
      if((plazoRequerido > pn[i]) & (plazoRequerido<=pn[i+1])){
        a = pn[i+1]-pn[i];
        p1 = (pn[i+1]*tn[i+1]-pn[i]*tn[i])/a;
        p2 = (pn[i+1]*pn[i]*(tn[i]-tn[i+1]))/(a*plazoRequerido);
        interpolacionRAW=p2+p1;  
        break;
      } else if(plazoRequerido>pn[(numero_plazo-1)]){
        // Cuando el plazo es mayor al maximo plazo del vector de plazos
        // entonces se extrapola
        a=pn[(numero_plazo)]-pn[numero_plazo-1];
        p1=(pn[(numero_plazo)]*tn[(numero_plazo)]-pn[numero_plazo-1]*tn[numero_plazo-1])/a;
        interpolacionRAW=(p1*(plazoRequerido-pn[(numero_plazo)])+pn[(numero_plazo)]*tn[(numero_plazo)])/plazoRequerido;
        break;
      } else if(plazoRequerido<pn[0]){
        // Cuando el plazoRequerido es menor que el plazo minimo del vector de plazos
        // se extrapola, para atraz
        a=pn[1]-pn[0];
        p1=(pn[1]*tn[1]-pn[0]*tn[0])/a;
        interpolacionRAW=(p1*(plazoRequerido-pn[1])+pn[1]*tn[1])/plazoRequerido;
        break;
      }

    }

  }

  return interpolacionRAW;
}

有了这个输入,我在循环函数时不会遇到任何问题:

plazo2 = c(0.25,0.50,1.00,3.00,5.00,7.00,10.00,15.00)
dato2 = c(4.147594,4.197599 ,4.403012,5.281392,6.169297,7.124895,8.699570,11.574581)
x = NULL
for(i in 1:10000){
  x = rbind(x,InterpolacionRAWCpp(plazo2,dato2,10))
}

但是如果我为此更改 plazo2 和 dato2:

plazo1 = c(0.08333,0.16667,0.25000,0.50000,1.01389,2.02778,3.04167,4.05556,5.06944,
           6.08333,7.09722,8.11111,9.12500,10.13889,11.15278,12.16667,13.18056,14.19444,15.20833)
dato1 = c(4.11798,4.13244,4.14501,4.19365,4.39560,4.80608,5.27216,5.71510,6.16038,
         6.62284,7.11100,7.67899,8.17816,8.68633,9.20055,9.71490,10.32713,10.94182,11.55650)

Rstudio 会崩溃

最佳答案

这是一个索引错误。 C++ 索引范围从 0 到 n-1 而不是 R 的 1 到 n 系统。

在某种程度上,您在这里考虑的是:

// Note vectors are n+1
NumericVector tn(tasas.size()+1);
NumericVector pn(tasas.size()+1);

// Assign into 0
tn[0] = tasas[0];
pn[0] = 0;

然而,下一部分是有问题的:

// Here we are using n+1 but need just n. 
tn[Rcpp::Range(1,tn.size())] = tasas;
pn[Rcpp::Range(1,pn.size())] = plazos;

将最后一部分切换为:

// Retrieves n+1 and by subtracting 1 we stay in range.
tn[Rcpp::Range(1,tn.size() - 1)] = tasas;
pn[Rcpp::Range(1,pn.size() - 1)] = plazos;

关于c++ - 使用 "long"输入时 Rcpp 函数使 R 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54816624/

相关文章:

c++ - 获取模板类包含的类型

c++ - 如何跳出一个C++代码块?

r - 无法将变量通过管道传递到级别

r - 通过分组因子对 data.frame 中的矩阵列表列求和

r - 如何将 data.frame 转换为矩阵?

Rcpp:如果我转换到 SEXP 或从 SEXP 转换,对象是否受到安全保护?

使用 Rcpp 的 R 分位数

python - 将参数从 python 解析为 C++

r - 使用 Rcpp 构建包,未正确处理属性

c++ - 如何强制 clang 默认使用某些库?