与逻辑语句匹配的Rcpp矩阵的子集

时间:2012-10-23 19:58:53

标签: c++ r rcpp

在R中,如果我们有一个数据矩阵,比如一个100乘10的矩阵X,一个带有可能值(0,1,2,3)的100个元素的矢量t,我们可以很容易地找到X的子矩阵y使用简单的语法:

y = X[t == 1, ]

但问题是,我怎么能用Rcpp的NumericMatrix做到这一点? (或者,更一般地说,我如何在C ++的任何容器中做到这一点?)

感谢Dirk的提示,似乎

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));

可以做我想做的事,但这似乎太冗长了。

2 个答案:

答案 0 :(得分:9)

我最接近的是find()函数与Armadillo submat()函数的组合RcppArmadillo可通过{{3}}访问。

编辑:这当然是我们可以通过补丁添加的东西。如果有人有足够的动力尝试这个,请访问rcpp-devel邮件列表。

答案 1 :(得分:9)

我很想将此视为糖。不幸的是,我没有资格实施它。我仍然使用了许多不同的解决方案。

首先,我必须对Gong-Yi Liao代码进行一些修改才能使其工作(colvec代替vec tIdxXmat.rows(...代替{ {1}}:

X.rows(...

其次,这里有三个基准逻辑语句所有子集矩阵的基准功能。函数采用arma或rcpp参数和返回值两个基于Gong-Yi Liao的解决方案,一个是基于循环的简单解决方案。

n(行)= 100,p(T == 1)= 0.3

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

n(行)= 10000,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

<强> submat.cpp

                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
相关问题