Rcpp Armadillo,子矩阵和子向量

时间:2016-04-12 14:51:46

标签: rcpp armadillo submatrix

我尝试将一些R代码翻译成RcppArmadillo,因此我还想执行以下操作:

假设存在非负向量v和矩阵M,两者都有例如m行。每当向量M的相应行中存在零时,我想摆脱矩阵v中的所有行,然后也去除向量{{中的所有零条目v 1}}。使用R这只是以下几点:

M = M[v>0,]

v = v[v>0] 

所以我的问题是,如果有办法在RcppArmadillo中这样做。由于我对任何编程语言都很陌生,我无法找到任何可以解决我的问题的东西,尽管我认为我不是第一个问这个问题的人可能很容易。

1 个答案:

答案 0 :(得分: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)))
*/