2016-10-29 5 views
2

Ich möchte komplexe Nummern von R zu meinem cpp-Code mit Rcpp übergeben. Ich versuche, analog komplexe Zahlen passieren, wie ein Doppelzimmer und ganze Zahlen passieren kann:Rcpp: wie komplexe Zahl von R zu cpp übergeben

#include <complex> 
#include <Rcpp.h> 

using namespace Rcpp; 

RcppExport SEXP mandelC(SEXP s_c) { 
    std::complex<double> c = ComplexVector(s_c)[0]; 
} 

Allerdings ist der Code nicht kompilieren und beschwert sich über:

g++ -I/usr/share/R/include -DNDEBUG -I/usr/share/R/include -fopenmp -I/home/siim/lib/R/Rcpp/include  -fpic -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -g -c a.cpp -o a.o 
a.cpp: In function ‘SEXPREC* mandelC(SEXP)’: 
a.cpp:7:50: error: conversion from ‘Rcpp::traits::storage_type<15>::type {aka Rcomplex}’ to non-scalar type ‘std::complex<double>’ requested 
std::complex<double> c = ComplexVector(s_c)[0]; 
              ^

Offensichtlich ich etwas falsch gemacht aber ich habe kann keine Beispiele finden. Kann mir jemand den richtigen Weg zeigen?

Antwort

3

Sie sind einige ziemlich einfache Dinge fehlen:

R> cppFunction("ComplexVector doubleMe(ComplexVector x) { return x+x; }") 
R> doubleMe(1+1i) 
[1] 2+2i 
R> doubleMe(c(1+1i, 2+2i)) 
[1] 2+2i 4+4i 
R> 

Denken Sie daran, dass alles ein Vektor in einem R und Skalare nicht „wirklich“ sind: sie sind Vektoren der Länge ein. Also für eine einzelne complex Nummer übergeben Sie (immer noch) eine ComplexVector, die zufällig der Länge eins ist.

Schauen Sie sich die zwei Pakete von Baptiste an, die komplexe Mathematik über RcppArmadillo ausführen - das "beweist", dass einige der RcppArmadillo-Interfaces so funktionieren, wie sie sollten.

Edit: Und wenn Sie wirklich einen skalaren möchten, können Sie es bekommen:

R> cppFunction("std::complex<double> doubleMeScalar(std::complex<double> x) { 
+             return x+x; }") 
R> doubleMeScalar(1+1i) 
[1] 2+2i 
R> 
+0

OK, so schlage vor, Sie nicht allgemeine sexp aber komplexerVektor statt zu gehen und tun Mathe mit komplexerVektor statt von std :: komplex? Gibt es eine einfache Möglichkeit, einen einzelnen (skalaren) std :: -Komplex aus ComplexVector zu holen? –

+0

Sehr geehrter Herr Miller aka "@ Hack-R" aka: Sie wurden zweimal markiert und suspendiert; Ich bitte darum, die Bearbeitung von Posts ohne vorherige Zustimmung einzustellen. Vielen Dank. –

+0

@OttToomet: Tun Sie sich einen Gefallen und lesen Sie schnell die Vignetten für Rcpp-Attribute. Sie können möglicherweise keinen prägnanteren Code schreiben als das, was ich hier gezeigt habe - und wo wir die Tatsache ausnutzen, dass Rcpp Dinge hinter den Kulissen für uns umwandelt. _Internally_ es wird immer eine 'SEXP' Übertragung sein. Aber ich finde die Ebene C-Schnittstelle zu umständlich, und Sie scheinen sich auch darin verlaufen zu haben. Rcpp hält eine Menge Dinge, die ziemlich einfach sein sollten ... nur das: ziemlich einfach. –