Wandle RcppArmadillo-Vektor in Rcpp-Vektor um

8

Ich versuche, RcppArmadillo-Vektor (z. B. arma::colvec ) in einen Rcpp-Vektor ( NumericVector ) zu konvertieren. Ich weiß, dass ich zuerst arma::colvec in SEXP umwandeln und dann SEXP in NumericVector umwandeln kann (z. B. as<NumericVector>(wrap(temp) ), vorausgesetzt, dass temp ein arma::colvec -Objekt ist). Aber was ist ein guter Weg, das zu tun?

Ich möchte das einfach tun, weil ich unsicher bin, ob es in Ordnung ist, arma::colvec object als Parameter an ein Rcpp::Function -Objekt zu übergeben.

    
Raymond Wong 10.01.2013, 07:50
quelle

3 Antworten

7

Ich habe versucht, ein Rcpp::Function mit dem Argument arma::vec auszuwerten, es scheint, dass es das Argument in drei Formen ohne Kompilierungsfehler braucht. Das heißt, wenn f ein Rcpp::Function und a ein arma::vec ist, dann

  1. f(a)
  2. f(wrap(a))
  3. f(as<NumericVector>(wrap(a)))
  4. f(NumericVector(a.begin(),a.end()))

erzeugt zumindest scheinbar keine Kompilierungs- und Laufzeitfehler.

Aus diesem Grund habe ich einen kleinen Test für die drei Versionen von Argumenten durchgeführt. Da ich vermute, dass bei der Garbage Collection etwas schief gehen wird, teste ich sie nochmal gctorture .

%Vor%

Als Ergebnis erzeugt die erste Methode einen Fehler, die zweite Methode erzeugt eine falsche Antwort und nur die dritte Konvertierung gibt eine korrekte Antwort zurück.

%Vor%

Beachten Sie, dass, wenn gctorture auf FALSE gesetzt ist, alle drei Funktionen ein korrektes Ergebnis liefern.

%Vor%

Dies bedeutet, dass Methode 1 und Methode 2 unterbrochen werden, wenn während der Laufzeit Müll gesammelt wird und wir nicht wissen, wann es passiert. Daher ist es gefährlich , den Parameter nicht korrekt zu umbrechen.

Bearbeiten : Ab dem 5.12.2017 erzielen alle vier Conversions das korrekte Ergebnis.

  1. f(a)
  2. f(wrap(a))
  3. f(as<NumericVector>(wrap(a)))
  4. f(NumericVector(a.begin(),a.end()))

und das ist der Maßstab

%Vor%

Und f(NumericVector(a.begin(),a.end())) ist marginal schneller als andere Methoden.

    
Randy Lai 12.03.2014 07:08
quelle
4

Dies sollte mit arma::vec , arma::rowvec und arma::colvec funktionieren:

%Vor%     
Artem Klevtsov 24.05.2016 14:25
quelle
1

Ich hatte dieselbe Frage. Ich benutzte wrap, um die Umwandlung im Kern mehrerer Schichten von for-Schleifen durchzuführen, und es war sehr langsam. Ich denke, dass die Wrap-Funktion dafür verantwortlich ist, dass die Geschwindigkeit nach unten gezogen wurde, daher möchte ich wissen, ob es einen eleganten Weg dafür gibt.

Was Raymonds Frage betrifft, sollten Sie versuchen, den Namespace wie folgt einzufügen: Rcpp::as<Rcpp::NumericVector>(wrap(A)) oder am Anfang des Codes eine Zeile using namespace Rcpp; einzufügen.

    
Clavichord 12.01.2013 19:47
quelle

Tags und Links