'daki zaman argümanı ile R rep reprodüksiyonu Rcpp kullanmayı öğreniyorum. . Ben R. Rcpp içinde rep
fonksiyon R. içinde rep
(en sayfa 3 alt kısmını görmek için gelen birkaç şeker işlevleri içerir çoğaltmak için C++ kullanmak istiyorum: http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-quickref.pdf Ben belgeleri anlamak gibi şeker fonksiyonları rep
, rep_each
, ve rep_len
iki argüman alır - bir vektör ve bir tamsayı.Ama yapmak istediğim, times
argümanını kullandığımda R içinde rep
'un işlevselliğini çoğaltmaktır.Bu durumda, iki vektör sağlayabilirsiniz. R:C++ ve Rcpp
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
Böylece
times
bağımsız değişken ile rep
her öğe çoğaltır, karşılık gelen y
değeri kadar çok kez. Anladığım kadarıyla, bunun için Rcpp şeker fonksiyonlarını kullanmanın bir yolunu göremiyorum.
// [[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
Ben bu hızlandırmak için zaten var olup olmadığını merak ya da herhangi bir iyi fikri varsa am R. içinde rep
biraz daha yavaştır:
ben çalışır aşağıdaki C++ işlevi oluşturduk. Anladığım kadarıyla, rep
C kodunu çağırıyor, bu yüzden rep
'u iyileştirmek neredeyse imkansız olacaktır. Amacım, bir MCMC döngüsünü hızlandırarak (rep
işlevini kullanıyor) R'de çalışmak için çok zaman harcıyor, böylece herhangi bir hızlanma yararlı olacaktır. MCMC döngüsünün diğer bölümleri rep
değil, yavaş kısımlardır, ancak döngümde aynı işlevselliğe ihtiyacım var. Bunu hızlandırmak için
Değil yararlı emin, ama burada 'rep' kaynak koduna bir bağlantıdır. C'de gibi görünüyor. https://github.com/wch/r-source/blob/ed415a8431b32e079100f50a846e4769aeb54d5a/src/main/seq.c –
Çok * çok * ilk hızlı bakışta, iyi görünüyor. Daha gerçekçi boyutlarda karşılaştırma yapmak isteyebilirsiniz. –