2 votes

Subset vector by bool vector dans Rcpp

J'aimerais subdiviser un vecteur {1,2,3,4} avec un vecteur bool. Par exemple, si mon vecteur bool est {false,true,true,true}, j'aimerais obtenir le vecteur {2,3,4}. En R normal, je pourrais le faire avec

    sample_states<-c(1:4)[c(a,b,c,d)]

où a,b,c,d sont des bools. Ma question est double : 1) Comment puis-je créer un vecteur de bools en utilisant Armadillo/Rcpp, et 2) comment puis-je utiliser ce vecteur pour sous-ensembler mon vecteur {1,2,3,4}. Merci d'avance pour votre temps.

6voto

Ralf Stubner Points 14930

Voici deux exemples rapides de création d'un Rcpp::LogicalVector et de sous-ensemble d'un autre vecteur avec celui-ci :

#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]

// [[Rcpp::export]]
Rcpp::NumericVector subset1() {
  Rcpp::NumericVector in = {1.0, 2.0, 3.0, 4.0};
  Rcpp::LogicalVector mask = {false, true, true, true};
  return in[mask];
}

// [[Rcpp::export]]
Rcpp::NumericVector subset2() {
  Rcpp::NumericVector in = Rcpp::runif(10);
  Rcpp::LogicalVector mask = in > 0.5;
  return in[mask];
}

/*** R
subset1()
set.seed(42)
subset2()
*/

Le premier exemple utilise l'"initialisation par accolades" de C++11 pour générer rapidement un fichier LogicalVector . Vous pouvez tout aussi bien attribuer les valeurs individuellement. Le deuxième exemple utilise une expression logique pour créer un fichier LogicalVector . Dans les deux cas, le sous-ensemble ressemble beaucoup à ce qui se passe en R (grâce au sucre Rcpp).

Comme Dirk l'a dit dans les commentaires : il y a d'autres exemples dans le site Web de la Commission européenne. Galerie Rcpp . Il suffit de rechercher "indexing" ou "LogicalVector".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X