我一直在測試Rcpp和RcppArmadillo以計算大矩陣的彙總統計信息。這比基礎的R colMeans或者Armadillo在約400萬行,45列上快得多(速度快5到10倍)。用於中位數計算的Rcpp NumericMatrix的排序列
colMeansRcpp <- cxxfunction(signature(X_="integer"),
plugin='Rcpp',
body='
Rcpp::IntegerMatrix X = X_;
int ncol = X.ncol(); int nrow = X.nrow();
Rcpp::NumericVector out(ncol);
for(int col = 0; col < ncol; col++){
out[col]=Rcpp::sum(X(_, col));
}
return wrap(out/nrow);
')
我真的要計算的位數,也許其他位數的繪圖 - 因爲它需要排序它更需要幫助的C++外包。犰狳似乎有點慢,所以我想在那種地方做一個類似的代碼上面,但我只是不能得到正確的語法...這裏就是我想..
# OK I'm aware this floor(nrow/2) is not **absolutely** correct
# I'm simplifying here
colMedianRcpp <- cxxfunction(signature(X_="integer"),
plugin='Rcpp',
body='
Rcpp::IntegerMatrix X = clone(X_);
int ncol = X.ncol(); int nrow = X.nrow();
Rcpp::NumericVector out(ncol);
for(int col = 0; col < ncol; col++){
X(_,col)= std::sort((X_,col).begin, (X_,col).end));
out[col]=X(floor(nrow/2), col));
}
return wrap(out);
')
基本上它是line
X(_,col)= std::sort((X_,col).begin, (X_,col).end));
我不知道如何用Rcpp糖和std C++的混合物來表達「就地排序」。對不起,我可以看到我在做什麼是錯誤的,但在正確的語法提示將是可愛的。
ps我是否正確我需要做這個clone(),所以我不改變R對象?
編輯 我添加RcppArmadillo代碼和基準比較,以解決下面的答案/評論。該基準僅在5萬行獲得了快速回復,但我記得它與其他許多類似。我意識到你是Rcpp作者..非常感謝你的時間!
這個想法發生了,也許我正在做一些與RcppArmadillo代碼相似的東西,使它比基礎colMeans或Rcpp版本運行得慢得多?
colMeansRcppArmadillo <- cxxfunction(signature(X_="integer"),
plugin="RcppArmadillo",
body='
arma::mat X = Rcpp::as<arma::mat > (X_);
arma::rowvec MD= arma::mean(X, 0);
return wrap(MD);
')
而基準是...
(mb = microbenchmark(
+ colMeans(fqSmallMatrix),
+ colMeansRcpp(fqSmallMatrix),
+ colMeansRcppArmadillo(fqSmallMatrix),
+ times=50))
Unit: milliseconds
expr min lq median uq max neval
colMeans(fqSmallMatrix) 10.620919 10.63289 10.640819 10.648882 10.907145 50
colMeansRcpp(fqSmallMatrix) 2.649038 2.66832 2.676709 2.700839 2.841012 50
colMeansRcppArmadillo(fqSmallMatrix) 25.687067 26.23488 33.168589 33.792489 113.832495 50
如果您只是想要中間值或其他分位數,您不必排序整個數組: [std :: nth_element](http://www.cplusplus.com/reference/algorithm/nth_element /) 的工作方式與std :: sort, 完全相同,但在所需元素處於最終位置時停止對數組進行排序。 – 2013-04-04 21:00:08
文森特的好評(和往常一樣) - 我們確實在這裏有一個Rcpp圖庫文章:http://gallery.rcpp.org/articles/sorting/ – 2013-04-04 21:01:28
謝謝我不知道std :: nth_element,和Rcpp圖庫文章非常好的如何使用STL排序,partial_sort等矢量....但我仍然不知道語法(如果存在)排序矩陣的列。 – 2013-04-04 21:19:04