2016-04-12 9 views
0

Rcppアルマジロ、部分行列とサブベクトル

は、例えばmのための両方、非負ベクトルvとマトリックスMがあると仮定します行。ベクトルvの対応する行にゼロがあり、その後にベクトルvのゼロであるすべてのエントリを取り除くたびに、マトリックスMのすべての行を取り除きたいと思います。 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

私はここに無意識に答えてくれて感謝していますが、これは数回でRcpp Galleryを参照していたので、本当に重複した質問です... –

関連する問題