Я изучаю использование 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
, но мне нужна такая же функциональность в моем цикле.