我尝试将一些R代码翻译成RcppArmadillo,因此我还想执行以下操作:
假设存在非负向量v
和矩阵M
,两者都有例如m
行。每当向量M
的相应行中存在零时,我想摆脱矩阵v
中的所有行,然后也去除向量{{中的所有零条目v
1}}。使用R这只是以下几点:
M = M[v>0,]
v = v[v>0]
所以我的问题是,如果有办法在RcppArmadillo中这样做。由于我对任何编程语言都很陌生,我无法找到任何可以解决我的问题的东西,尽管我认为我不是第一个问这个问题的人可能很容易。
答案 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)))
*/