2016-04-12 60 views
0

我尝试一些R代码里面翻译成RcppArmadillo,因此我也想执行以下操作:RCPP犰狳,子矩阵和子向量

假设有一个非负的矢量v和矩阵M,都与例如m行。我希望摆脱矩阵M中的所有行,只要在矢量v的对应行中存在零并且此后也除去矢量v中的零的所有条目。使用R这是单纯只是执行以下操作:

M = M[v>0,] 

v = v[v>0] 

所以我的问题是,如果有一种方法在RcppArmadillo做到这一点。由于我对任何编程语言都很陌生,因此我无法找到任何可以解决问题的东西,但我认为我不是第一个问这个问题的人。

回答

4

当然,还有一种方法可以对Rcpp(subsetting with Rcpp)和RcppArmadillo(Armadillo subsetting)中的元素进行子集化。

这是复制Armadillo中R子集行为的一种方法。

#include <RcppArmadillo.h> 
// [[Rcpp::depends(RcppArmadillo)]] 
using namespace Rcpp; 

// Isolate by Row 
// [[Rcpp::export]] 
arma::mat vec_subset_mat(const arma::mat& x, const arma::uvec& idx) { 
    return x.rows(find(idx > 0)); 
} 

// Isolate by Element 
// [[Rcpp::export]] 
arma::vec subset_vec(const arma::vec& x) { 
    return x.elem(find(x > 0)); 
} 

/*** R 
set.seed(1334) 
m = matrix(rnorm(100), 10, 10) 
v = sample(0:1, 10, replace = T) 

all.equal(m[v>0,], vec_subset_mat(m,v)) 
all.equal(v[v>0], as.numeric(subset_vec(v))) 
*/ 
+0

我很感谢@coatless在这里不知疲倦地回答这个问题,但它确实是一个重复的问题,因为我也在这几次引用了Rcpp画廊...... –