2016-04-12 106 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畫廊...... –