2017-01-29 7 views
1

for 루프가 포함되어 있으므로 r 함수를 Rcpp로 변환하여 속도를 높이려고합니다. 그 길을 따라 나는 평균 (x)만큼 단순한 벡터의 엔트리의 평균을 계산할 필요가 있지만 매회 결과로 0을주는 Rcpp에서는 작동하지 않는 것처럼 보입니다.Rcpp의 벡터 평균

cppFunction(
    "NumericVector fun(int n, double lambda, ...) { 
    ... 
    NumericVector y = rpois(n, lambda); 
    NumericVector w = dpois(y, lambda); 
    NumericVector x = w*y; 
    double z = mean(x); 
    return z; 
}") 

편집 :

내 코드는 다음과 같습니다 그래서 난 내 오류가 위에서 언급 한 것 때문이라고 생각, 및 z의 싱글, 더블의 반환 그냥 날이 문제를 격리하기 위해 노력하고있다.

cppFunction(
    "NumericVector zstat(int n, double lambda, double lambda0, int m) { 
    NumericVector z(m); 
    for (int i=1; i<m; ++i){ 
    NumericVector y = rpois(n, lambda0); 
    NumericVector w = dpois(y, lambda)/dpois(y,lambda0); 
    double x = mean(w*y); 
    z[i] = (x-2)/(sqrt(2/n)); 
    } 
    return z; 
}") 

답변

6

함수의 반환 형식이 NumericVector이지만, double로 변환 스칼라 값은 Rcpp::mean 반환 : 다음 코드는하지만 여전히 작동하지 않습니다.

library(Rcpp) 

cppFunction(
    "double fun(int n, double lambda) { 
    NumericVector y = rpois(n, lambda); 
    NumericVector w = dpois(y, lambda); 
    NumericVector x = w*y; 
    double z = mean(x); 
    return z; 
}") 

set.seed(123) 
fun(50, 1.5) 
# [1] 0.2992908 

NumericVector 이후 반환 형식, this constructor is called로 지정되는 코드에서 어떤 일이 일어나고 무엇

,

template <typename T> 
Vector(T size, 
    typename Rcpp::traits::enable_if<traits::is_arithmetic<T>::value, void>::type* = 0) { 
    Storage::set__(Rf_allocVector(RTYPE, size)) ; 
    init() ; 
} 

필수 유형으로 double 캐스트 :이 문제를 해결하면 문제가 해결됩니다 double의 잘린 값과 동일한 길이의 NumericVector을 작성합니다. ,

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
NumericVector from_double(double x) { 
    return x; 
} 

/*** R 

sapply(0.5:4.5, from_double) 
# [[1]] 
# numeric(0) 
# 
# [[2]] 
# [1] 0 
# 
# [[3]] 
# [1] 0 0 
# 
# [[4]] 
# [1] 0 0 0 
# 
# [[5]] 
# [1] 0 0 0 0 

*/ 

편집을 보여주기 위해 : 당신의 질문에 대해서는, 당신은 sqrt(2/n)에 의해 분할되어 2n 대부분의 경우 0으로 분열을 일으키는 원인이 끝나는 모두 정수, 어디에 - 따라서 결과 벡터의 모든 Inf 값 당신은 2.0 대신 2를 사용하여이 문제를 해결할 수 있습니다

#include <Rcpp.h> 
using namespace Rcpp; 

// [[Rcpp::export]] 
NumericVector zstat(int n, double lambda, double lambda0, int m) { 
    NumericVector z(m); 
    for (int i=1; i<m; ++i){ 
     NumericVector y = rpois(n, lambda0); 
     NumericVector w = dpois(y, lambda)/dpois(y,lambda0); 
     double x = mean(w * y); 
     // z[i] = (x - 2)/sqrt(2/n); 
     //      ^^^^^ 
     z[i] = (x - 2)/sqrt(2.0/n); 
     //     ^^^^^^^ 
    } 
    return z; 
} 

/*** R 

set.seed(123) 
zstat(25, 2, 3, 10) 
# [1] 0.0000000 -0.4427721 0.3199805 0.1016661 0.4078687 0.4054078 
# [7] -0.1591861 0.9717596 0.6325110 0.1269779 

*/ 

C++은 R 아니다 - 당신은 당신의 변수의 유형에 대한 더 조심해야합니다.

+0

감사합니다. 그러나 내 코드로 잘못된 문제를 확인했습니다. 전체 코드를 살펴볼 수 있습니까? –

+0

* "작동하지 않음"* 무엇을 의미합니까? 이 함수를 호출하는 방법을 보여주고 원하는 결과가 무엇인지 설명해야합니다. – nrussell

+0

내가 zstat (25,2,3,100)을 사용하여 호출하면 0 Inf -Inf -Inf -Inf Inf Inf -Inf ...를 사용합니다. 의도하지 않은 결과입니다. 원하는 결과는 첫 번째 코드 (고정 된 후)가 벡터 z에 저장되지만 m 번 반복되는 코드 여야합니다. –