Я изучаю использование Rcpp. Я хотел бы использовать С++ для репликации функции rep в R. Rcpp включает в себя несколько функций сахара, которые соответствуют rep в R. (см. Нижнюю часть страницы 3 по адресу: http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-quickref.pdf. Насколько я понимаю документацию, функции сахара rep, rep_each и rep_len принимают два аргумента - вектор и целое число. Однако, что бы я хотел чтобы повторить функцию rep в R, когда я использую аргумент times. В этом случае вы можете предоставить два вектора. Быстрый пример в R:
x <- c(10, 5, 12)
y <- c(2, 6, 3)
rep(x, times = y)
[1] 10 10 5 5 5 5 5 5 12 12 12
Таким образом, rep с аргументом times реплицирует каждый элемент x столько раз, сколько соответствующее значение y. Насколько я понимаю, я не вижу возможности использовать для этого функции сахара Rcpp.
Я создал следующую С++-функцию, которая работает:
// [[Rcpp::export]]
NumericVector reptest(NumericVector x, NumericVector y) {
int n = y.size();
NumericVector myvector(sum(y));
int ind = 0;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < y(i); ++j) {
myvector(ind) = x[i];
ind = ind + 1;
}
}
return myvector;
}
x <- c(10, 5, 12)
y <- c(2, 6, 3)
reptest(x, y)
[1] 10 10 5 5 5 5 5 5 12 12 12
Это немного медленнее, чем rep в R. Мне интересно, есть ли способ ускорить это, или если у кого-то есть лучшая идея. Насколько я понимаю, rep вызывает код C, поэтому, возможно, почти невозможно улучшить rep. Моя цель - ускорить цикл MCMC (который использует функцию rep), которая требует много времени для запуска в R, поэтому любое ускорение было бы полезно. Другие части цикла MCMC - это медленные части, а не rep, но мне нужна такая же функциональность в моем цикле.