2016-04-12 9 views
0

ich versuchen, einige R-Code in RcppArmadillo zu übersetzen und deshalb würde ich auch folgendes tun:RCPP Armadillo, Untermatrizen und Subvektoren

Angenommen, es ein nicht negativer Vektor mit v und eine Matrix M, die beide zum Beispiel ist m Reihen. Ich möchte alle Zeilen in der Matrix M loswerden, wenn in der entsprechenden Zeile des Vektors v eine Null steht und danach auch alle Einträge, die im Vektor v Null sind, loswerden. R Mit diesem ist einfach nur folgendes:

M = M[v>0,] 

v = v[v>0] 

Also meine Frage ist, ob es einen Weg gibt, diese in RcppArmadillo zu tun. Da ich in jeder Programmiersprache ziemlich neu bin, konnte ich nichts finden, was mein Problem lösen könnte, obwohl ich denke, dass ich nicht der Erste bin, der diese vielleicht recht einfache Frage stellt.

Antwort

4

Natürlich gibt es eine Möglichkeit, Elemente in Rcpp (subsetting with Rcpp) und RcppArmadillo (Armadillo subsetting) zu unterteilen.

Hier ist eine Möglichkeit, das Verhalten von R-Untergruppen in Armadillo zu replizieren.

#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

Ich bin @coatless dankbar für die unermüdliche Antwort hier, aber es ist wirklich eine doppelte Frage, da ich auch ein paar Mal auf die Rcpp Gallery verwiesen habe ... –