是否有任何C++函數等效於R中%in%
操作?考慮下面的命令在R:A C++的%版本%運算中的R
which(y %in% x)
我試圖找到用C東西相當於++(特別是在犰狳),我找不到任何東西。然後我寫了自己的函數,與上面的R命令相比,它非常慢。
這裏是我寫的:
#include <RcppArmadillo.h>
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
arma::uvec myInOperator(arma::vec myBigVec, arma::vec mySmallVec){
arma::uvec rslt = find(myBigVec == mySmallVec[0]);
for (int i = 1; i < mySmallVec.size(); i++){
arma::uvec rslt_tmp = find(myBigVec == mySmallVec[i]);
rslt = arma::unique(join_cols(rslt, rslt_tmp));
}
return rslt;
}
現在在上面的代碼採購後,我們有:
x <- 1:4
y <- 1:10
res <- benchmark(myInOperator(y, x), which(y %in% x), columns = c("test",
"replications", "elapsed", "relative", "user.self", "sys.self"),
order = "relative")
而且這裏的結果:
test replications elapsed relative user.self sys.self
2 which(y %in% x) 100 0.001 1 0.001 0
1 myInOperator(y, x) 100 0.002 2 0.001 0
任何人都可以指導我尋找一個相應的C++代碼(y%in%x)或讓我的代碼更高效?這兩種功能的使用時間已經非常短了。我想我的效率意味着更多的是從編程的角度,以及我對問題的看法以及我使用的命令是否有效。
我感謝您的幫助。
這將是硬的(在%x和y%)打''哪,因爲' %in(調用'match')和'which'已經是'.Internal'函數,因此在C中實現並可能被優化。雖然可以通過避免'%in%'生成的臨時邏輯向量來提高性能。 –
它可能會有點幫助,如果你通過引用而不是複印,'(常量ARMA :: VEC&myBigVec,常量ARMA :: VEC&mySmallVec)傳遞的東西' – OneOfOne
我dont't不夠了解RCPP(並沒有什麼的阿米迪洛),所以我不能回答這個問題。但是,如果我在C++中這樣做,我會查找'std :: set_intersection'。 –