vacio subconjuntos subconjunto studio str seleccionar propio programar programa pertenencia numericos funcion español elementos ejemplos datos data crear contenencia conjuntos conjunto columnas c++ r rcpp

c++ - subconjuntos - subconjunto propio



Subconjunto de una matriz de Rcpp que coincide con una declaración lógica (2)

Lo más cercano que conozco es la combinación de la función find() combinada con la función submat() en Armadillo accesible a través de RcppArmadillo .

Edición: Esto es, por supuesto, algo que podríamos agregar a través de un parche. Si alguien está lo suficientemente motivado para probar esto, por favor, vaya a la lista de correo de rcpp-devel.

En R, si tenemos una matriz de datos, digamos una matriz X de 100 por 10, y un vector t de 100 elementos con valores posibles (0, 1, 2, 3), podemos encontrar fácilmente una submatriz y de X usando un simple sintaxis:

y = X[t == 1, ]

Pero, el problema es, ¿cómo puedo hacer eso con NumericMatrix de Rcpp?
(O, más generalmente, ¿cómo puedo hacer eso en cualquier contenedor de C ++?)

Gracias a la insinuación de Dirk, parece que

NumericMatrix X(dataX); IntegerVector T(dataT); mat Xmat(X.begin(), X.nrow(), X.ncol(), false); vec tIdx(T.begin(), T.size(), false); mat y = X.rows(find(tIdx == 1));

Puedo hacer lo que quiera, pero eso parece demasiado largo.


Me encantaría ver esto como el azúcar. Desafortunadamente, no estoy calificado para implementarlo sin embargo. Aquí hay todavía una serie de soluciones diferentes con las que jugué.

Primero, tuve que hacer algunas modificaciones al código colvec de Gong-Yi para que esto funcionara ( colvec lugar de vec para tIdx y Xmat.rows(... lugar de X.rows(... :

mat Xmat(X.begin(), X.nrow(), X.ncol(), false); colvec tIdx(T.begin(), T.size(), false); mat y = Xmat.rows(find(tIdx == 1));

En segundo lugar, aquí hay tres funciones con puntos de referencia que todas las matrices de subconjuntos se basan en una declaración lógica. Las funciones toman los argumentos de arma o rcpp y devuelven valores. Dos se basan en la solución de Gong-Yi Liao y una es una solución simple basada en bucles.

n (filas) = ​​100, p (T == 1) = 0.3

expr min lq median uq max 1 submat_arma(X, T) 5.009 5.3955 5.8250 6.2250 28.320 2 submat_arma2(X, T) 4.859 5.2995 5.6895 6.1685 45.122 3 submat_rcpp(X, T) 5.831 6.3690 6.7465 7.3825 20.876 4 X[T == 1, ] 3.411 3.9380 4.1475 4.5345 27.981

n (filas) = ​​10000, p (T == 1) = 0.3

expr min lq median uq max 1 submat_arma(X, T) 107.070 113.4000 125.5455 141.3700 1468.539 2 submat_arma2(X, T) 76.179 80.4295 88.2890 100.7525 1153.810 3 submat_rcpp(X, T) 244.242 247.3120 276.6385 309.2710 1934.126 4 X[T == 1, ] 229.884 236.1445 263.5240 289.2370 1876.980

submat.cpp

#include <RcppArmadillo.h> // [[Rcpp::depends(RcppArmadillo)]] using namespace Rcpp; using namespace arma; // arma in; arma out // [[Rcpp::export]] mat submat_arma(arma::mat X, arma::colvec T) { mat y = X.rows(find(T == 1)); return y; } // rcpp in; arma out // [[Rcpp::export]] mat submat_arma2(NumericMatrix X, NumericVector T) { mat Xmat(X.begin(), X.nrow(), X.ncol(), false); colvec tIdx(T.begin(), T.size(), false); mat y = Xmat.rows(find(tIdx == 1)); return y; } // rcpp in; rcpp out // [[Rcpp::export]] NumericMatrix submat_rcpp(NumericMatrix X, LogicalVector condition) { int n=X.nrow(), k=X.ncol(); NumericMatrix out(sum(condition),k); for (int i = 0, j = 0; i < n; i++) { if(condition[i]) { out(j,_) = X(i,_); j = j+1; } } return(out); } /*** R library("microbenchmark") # simulate data n=100 p=0.3 T=rbinom(n,1,p) X=as.matrix(cbind(rnorm(n),rnorm(n))) # compare output identical(X[T==1,],submat_arma(X,T)) identical(X[T==1,],submat_arma2(X,T)) identical(X[T==1,],submat_rcpp(X,T)) # benchmark microbenchmark(X[T==1,],submat_arma(X,T),submat_arma2(X,T),submat_rcpp(X,T),times=500) # increase n n=10000 p=0.3 T=rbinom(n,1,p) X=as.matrix(cbind(rnorm(n),rnorm(n))) # benchmark microbenchmark(X[T==1,],submat_arma(X,T),submat_arma2(X,T),submat_rcpp(X,T),times=500) */