Rcpp:如何将复数从R传递到cpp

Ott*_*met 4 c++ r complex-numbers rcpp

我想使用Rcpp将复数从R传递到我的cpp代码。我尝试类似地传递复数,因为可以传递双精度和整数:

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

using namespace Rcpp;

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

但是,该代码无法编译,并抱怨:

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];
                                              ^
Run Code Online (Sandbox Code Playgroud)

显然,我做错了事,但是我一直找不到任何例子。任何人都可以指出我正确的路径吗?

Dir*_*tel 5

您缺少一些非常简单的东西:

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> 
Run Code Online (Sandbox Code Playgroud)

请记住,所有事物都是R中的向量,并且标量并不“真正”存在:它们是长度为1的向量。因此,对于一个complex数字,您(仍然)传递ComplexVector的长度恰好是一个。

看看Baptiste的两个软件包,它们通过RcppArmadillo进行复杂的数学运算,这些软件包“证明”了某些RcppArmadillo接口以应有的方式工作。

编辑:如果您真的想要一个标量,也可以得到它:

R> cppFunction("std::complex<double> doubleMeScalar(std::complex<double> x) { 
+                                                   return x+x; }")
R> doubleMeScalar(1+1i)
[1] 2+2i
R> 
Run Code Online (Sandbox Code Playgroud)