2013-10-15 3 views
0

Я начинаю использовать Rcpp, и я хочу получить более быстрый выбор значений векторов после вычисления квантилей. В приведенном ниже примере он работает хорошо, когда введены значения нижнего и верхнего пределов
, рассчитанные по функции qnorm (функция val.sel.1). Тем не менее, когда эти пределы исходят из предшествующего расчета, результирующий вектор не получается (функция val.sel.2). Мне интересно, что не так в том, что я использую в аргументах. Заранее благодарим за любую помощь. АленRcpp: удобное использование компараторов

R> src.1 <-' 
NumericVector x = xx, p = prob; 
int n = p.size() ; 
int m = x.size() ; 
NumericVector res(n), quant ; 
for(int i=0; i<n; i++) res[i] = R::qnorm(p[i], Rcpp::mean(x), Rcpp::sd(x), 1, 0) ; 
for(int i=0; i<m; i++) { 
if (x[i] > 35.45295 && x[i] < 83.34705) quant.push_back(x[i]); 
} 
return wrap(quant) ; 
' 
R> val.sel.1 <- cxxfunction(signature(xx="numeric", prob="numeric"), plugin='Rcpp', body=src.1) 

R> x <- c(77, 95, 16, 54, 63, 93, 44, 88, 25, 39) 

R> val.sel.1(x, prob=c(0.2,0.8))  # [1] 77 54 63 44 39 


R> src.2 <-' 
NumericVector x = xx, p = prob; 
int n = p.size() ; 
int m = x.size() ; 
NumericVector res(n), quant ; 
for(int i=0; i<n; i++) res[i] = R::qnorm(p[i], Rcpp::mean(x), Rcpp::sd(x), 1, 0) ; 
for(int i=0; i<m; i++) { 
if (x[i] > res[1] && x[i] < res[2]) quant.push_back(x[i]); 
} 
return wrap(quant) ; 
' 
R> val.sel.2 <- cxxfunction(signature(xx="numeric",prob="numeric"),plugin='Rcpp',  body=src.2) 

R> val.sel.2(x, prob=c(0.2,0.8))   # numeric(0) 
+0

Извините, но я не понимаю ваш вопрос. –

ответ

3

Некоторые комментарии:

1) Использование push_back на Rcpp контейнеры, как правило, считается «плохой практикой», поскольку она заставляет копию вектора с каждым нажатием; лучше инициализировать вектор с заданным размером и заполнить их по мере необходимости, либо для циклов, итераторов, и для алгоритмов STL ... См. Rcpp Gallery для многих хороших примеров того, как это делается.

2) Если вы действительно хотите использовать push_back, рассмотрите использование контейнеров STL, например. std::vector<double> или std::vector<int> и Rcpp::wrap -ный выход при возврате результата к R.

Что касается вашей реальной проблемы, это простая ошибка - вы используете R стиль индексацию массива, а не C++ индексирования массива стиля. Изменение

if (x[i] > res[1] && x[i] < res[2]) quant.push_back(x[i]); 

в

if (x[i] > res[0] && x[i] < res[1]) quant.push_back(x[i]); 

и вы получите ожидаемый результат.

+0

Ваш совет очень полезен. Благодарю. Alain –

Смежные вопросы