2017-04-18 6 views
1

예기치 않은 충돌이 나는 norm_vec를 얻기 위해 다음과 같은 재귀 행 단위 작업을 실행하려고 :Rcpp | 대용량 데이터

#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에별로 만족스럽지 않습니다. 아마도 기본적인 실수를했을 것입니다. 미리 도움을 주셔서 대단히 감사합니다!

답변

2

R의 루프는 1에서 T까지이지만 C/C++에서는 0에서 T-1까지입니다.

루프에서 iT까지 올라가고 ji까지 올라갑니다. 이 방법으로 iT에 도달 할 수 있으며 최대 값은 T-1입니다.

+0

감사합니다. Andrey! – jayc