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.
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
f(a)
f(wrap(a))
f(as<NumericVector>(wrap(a)))
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
.
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.
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.
f(a)
f(wrap(a))
f(as<NumericVector>(wrap(a)))
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.
Dies sollte mit arma::vec
, arma::rowvec
und arma::colvec
funktionieren:
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.