将R复杂对象传递给犰狳C++
当与其他语言接口时,R使用包含类型Rcomplex
的标头R_ext/Complex.h
,其似乎是std::complex<double>
的实现。使用它的标准方式将是一个复杂的向量x_
在R
: Rcomplex *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.
编辑:下面一个评论,我想澄清的是Rcomplex
是C
类型,但它根据与std::complex<double>
兼容answer by @Stephen Canon。
编辑2:为什么德克的回答比接受的答案有更多的投票,如果它不回答“没有依赖”的问题。另外,我显然已经被低估了,因为如果最好是用C或C++来使用base R,有人不喜欢它。无论如何,我有更好的事情要做,但这不是我第一次在提出某些与基准R与C或C++接口相关的问题时得不到我原来的问题的答案,并且得到了一个我没有要求的相关答案Rcpp
。
一种类型可以使用reinterpret_cast始终强制为另一种类型。一般来说,这是一个坏主意,但如果你能保证这两个复杂类型的确是兼容的,你可以这样做:
Rcomplex* px = COMPLEX(x_);
arma::cx_vec x(reinterpret_cast<arma::cx_double*>(px), nrows(x_), false, false);
类型arma::cx_double
是shorthand为std::complex<double>
复数是在不太常见统计数据并不是最初的重点。不过也有使用情况巴蒂斯特有one或two包其推到功能添加到给定的犰狳和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.没有编写额外的代码行,也没有可识别的开销。
为什么你不想使用RcppArmadillo有一个特定的原因吗? – Roland
@Roland对于简单的事情,我通常更喜欢避免依赖,我的功能非常简单,但我想加快速度。 – nopeva
@nopeva:这就是所谓的重塑车轮。按照相同的逻辑,你不会使用犰狳。或R. –