Есть ли какая-либо функция в C++, эквивалентная оператору %in%
в R? Рассмотрим приведенную ниже команду в R:C++ версия оператора% in% в R
which(y %in% x)
Я пытался найти что-то эквивалент в C++ (в частности, в Armadillo), и я не мог ничего найти. Затем я написал свою собственную функцию, которая очень медленная по сравнению с приведенной выше командой 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% в% x), либо сделать мой код более эффективным? Истекшее время для обеих функций уже очень мало. Я предполагаю, что я имею в виду, по эффективности, больше от перспективы программирования и от того, насколько эффективен способ, которым я думал о проблеме, и используемые мной команды.
Я ценю вашу помощь.
Это будет трудно превзойти 'какой (у% в% х)', так как ' % in% '(вызов' match') и 'which' уже являются' .Internal' функциями и, следовательно, реализованы на C и, вероятно, оптимизированы. Возможно, что можно повысить производительность, избегая временного логического вектора, генерируемого '% in%'. –
Возможно, это поможет немного, если вы передадите материал по ссылке вместо создания копий: '(const arma :: vec & myBigVec, const arma :: vec & mySmallVec)' – OneOfOne
Я не знаю достаточно о RCpp (и ничего не знаю о Армидилло), поэтому я не могу ответить на вопрос. Однако, если бы я делал это на C++, я бы посмотрел на 'std :: set_intersection'. –