在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));
可以做我想做的事,但这似乎太冗长了。
答案 0 :(得分:9)
我最接近的是find()
函数与Armadillo submat()
函数的组合RcppArmadillo可通过{{3}}访问。
编辑:这当然是我们可以通过补丁添加的东西。如果有人有足够的动力尝试这个,请访问rcpp-devel邮件列表。
答案 1 :(得分:9)
我很想将此视为糖。不幸的是,我没有资格实施它。我仍然使用了许多不同的解决方案。
首先,我必须对Gong-Yi Liao代码进行一些修改才能使其工作(colvec
代替vec
tIdx
和Xmat.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