将R复杂对象传递给犰狳C++

问题描述:

当与其他语言接口时,R使用包含类型Rcomplex的标头R_ext/Complex.h,其似乎是std::complex<double>的实现。使用它的标准方式将是一个复杂的向量x_RRcomplex *px = COMPLEX(x_); 然而,因为我需要它传递给armadillo然后我做的: arma::cx_vec x(px, nrows(x_), false, false);将R复杂对象传递给犰狳C++

armadillo不接受Rcomplex类型。我曾尝试这样做,而不是: std::complex<double> *px = COMPLEX(x_); 但得到以下error: cannot convert ‘Rcomplex*’ to ‘std::complex<double>*’ in initialization

你有R中经过复杂的矢量std::complex<double> type任何线索?我知道Rcpp但想有一个直接的解决方案依托基地R.

编辑:下面一个评论,我想澄清的是RcomplexC类型,但它根据与std::complex<double>兼容answer by @Stephen Canon。

编辑2:为什么德克的回答比接受的答案有更多的投票,如果它不回答“没有依赖”的问题。另外,我显然已经被低估了,因为如果最好是用C或C++来使用base R,有人不喜欢它。无论如何,我有更好的事情要做,但这不是我第一次在提出某些与基准R与C或C++接口相关的问题时得不到我原来的问题的答案,并且得到了一个我没有要求的相关答案Rcpp

+0

为什么你不想使用RcppArmadillo有一个特定的原因吗? – Roland

+0

@Roland对于简单的事情,我通常更喜欢避免依赖,我的功能非常简单,但我想加快速度。 – nopeva

+0

@nopeva:这就是所谓的重塑车轮。按照相同的逻辑,你不会使用犰狳。或R. –

一种类型可以使用reinterpret_cast始终强制为另一种类型。一般来说,这是一个坏主意,但如果你能保证这两个复杂类型的确是兼容的,你可以这样做:

Rcomplex* px = COMPLEX(x_); 
arma::cx_vec x(reinterpret_cast<arma::cx_double*>(px), nrows(x_), false, false); 

类型arma::cx_doubleshorthandstd::complex<double>

复数是在不太常见统计数据并不是最初的重点。不过也有使用情况巴蒂斯特有onetwo包其推到功能添加到给定的犰狳和R.现有的支持

因此,所有的工作是为你做的模板界面 - 在这里是最简单的例子可能经过复值矩阵并返回其总和:

#include <RcppArmadillo.h> 

// [[Rcpp::depends(RcppArmadillo)]] 

// [[Rcpp::export]] 
arma::cx_mat foo(const arma::cx_mat & C) { 
    return C + C; 
} 

/*** R 
C <- matrix((1+1i) * 1:4, 2, 2) 
C 
foo(C) 
*/ 

它你所期望:

R> sourceCpp("/tmp/armaComplex.cpp") 

R> C <- matrix((1+1i) * 1:4, 2, 2) 

R> C 
    [,1] [,2] 
[1,] 1+1i 3+3i 
[2,] 2+2i 4+4i 

R> foo(C) 
    [,1] [,2] 
[1,] 2+2i 6+6i 
[2,] 4+4i 8+8i 
R> 

所以我们开始与R中复杂的值,通过RCPP和RcppArma通过他们dillo转到Armadillo,然后让他们回到R.没有编写额外的代码行,也没有可识别的开销。