0

我尝试将一些 R 代码翻译成RcppArmadillo,因此我还想做以下事情:

假设有一个非负向量v和一个矩阵M,例如m行。M每当向量的相应行为零时,我想摆脱矩阵中的所有行,v然后还要摆脱向量中为零的所有条目v。使用 R 这只是以下内容:

M = M[v>0,]

v = v[v>0] 

所以我的问题是是否有办法在 RcppArmadillo 中做到这一点。由于我对任何编程语言都很陌生,所以我找不到任何可以解决我的问题的东西,尽管我认为我不是第一个提出这个可能很简单的问题的人。

4

1 回答 1

5

当然,有一种方法可以在 Rcpp(使用 Rcpp 子集)和 RcppArmadillo(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)))
*/
于 2016-04-12T15:32:34.690 回答