This question already has an answer here:
Rcpp function crashes
(1个答案)
3年前关闭。
我正在尝试运行以下递归的逐行操作以获得
用
我对cpp不太满意-可能我犯了一个基本错误。非常感谢您的提前帮助!
(1个答案)
3年前关闭。
我正在尝试运行以下递归的逐行操作以获得
norm_vec
:#include <Rcpp.h>
#ifdef _OPENMP
#include <omp.h> // OpenMP header
#endif
using namespace Rcpp;
using namespace std;
// [[Rcpp::export]]
NumericVector sim1(NumericVector X) {
int T = X.length();
NumericVector norm_vec = NumericVector(T);
norm_vec[0] = 0;
int i = 1;
while (i <= T) {
NumericVector sim_vec = NumericVector(i);
NumericVector weight_vec = NumericVector(i);
NumericVector norm = NumericVector(i);
int j = 0;
double sim_vec_sum = 0;
while (j <= i) {
sim_vec[j] = exp(-abs(X[i] - X[i-j-1]));
sim_vec_sum += sim_vec[j];
j++;
}
j = 0;
double norm_sum = 0;
while (j <= i) {
weight_vec[j] = sim_vec[j]/sim_vec_sum;
norm[j] = X[j]*weight_vec[j];
norm_sum += norm[j];
j++;
}
norm_vec[i] = norm_sum;
i++;
}
return norm_vec;
}
用
sourceCpp("sim1.cpp")
调用上面的代码,我想获取sim1(rnorm(n))
。较小的n
可以正常运行代码,但n
超过19时R会完全关闭。我对cpp不太满意-可能我犯了一个基本错误。非常感谢您的提前帮助!
最佳答案
R中的循环从1
变为T
,但是在C / C++中,它们的循环从0
变为T-1
。
在循环中,i
升至T
,j
升至i
。这样,i
可以达到T
,这超过了T-1
的最大值。
09-03 18:20