2016-04-12 5 views
0

Я пытаюсь перевести некоторый R код в RcppArmadillo и поэтому я хотел бы сделать следующее:Rcpp Armadillo, подматрицы и Подвекторы

Предположим, что существует неотрицательная вектор v и матрица M, как с, например m строк. Я хотел бы избавиться от всех строк в матрице M всякий раз, когда есть нуль в соответствующей строке вектора v, а затем также избавиться от всех записей, которые равны нулю в векторе v. Использование R это просто только следующее:

M = M[v>0,] 

v = v[v>0] 

Так что мой вопрос, если есть способ сделать это в RcppArmadillo. Поскольку я совершенно новичок в любом языке программирования, я не смог найти ничего, что могло бы решить мою проблему, хотя я думаю, что я не первый, кто задает этот, может быть, довольно простой вопрос.

ответ

4

Конечно, есть способ подгонять элементы как в Rcpp (subsetting with Rcpp), так и в RcppArmadillo (Armadillo subsetting).

Вот способ воспроизвести поведение подмножеств R в Armadillo.

#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 галерея на этом несколько раз ... –