将R complex对象传递给armadillo C ++

时间:2016-09-29 07:24:34

标签: c++ r armadillo

在与其他语言交互时,R使用包含R_ext/Complex.h类型的标头Rcomplexstd::complex<double>似乎是x_的实现。使用它的标准方法是R中的复杂向量Rcomplex *px = COMPLEX(x_);armadillo 但是,因为我需要将它传递给arma::cx_vec x(px, nrows(x_), false, false);然后我做: armadillo

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

您是否有任何线索将R中的复杂向量传递给Rcpp?我知道Rcomplex但希望有一个直接的解决方案,依赖于基础R。

编辑:根据其中一条评论,我想澄清Cstd::complex<double>类型,但根据answer @ Rcppionic2@RC.0兼容斯蒂芬佳能。

EDIT2:如果没有回答“没有依赖性”的问题,为什么Dirk的答案会比接受的答案拥有更多的选票。另外,我显然是因为如果一个人希望最好使用带有C或C ++的基础R,那么有人不喜欢它。无论如何,我有更好的事情要做,但这并不是我第一次在询问与R或C或C ++接口相关的内容时得不到我的原始问题的答案,并获得rollup相关的答案我没有要求。

2 个答案:

答案 0 :(得分:4)

复杂数字在统计数据中不常见,所以这不是最初的焦点。但是有一些用例Baptiste有onetwo个软件包,在Armadillo和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和RcppArmadillo将它们传递给Armadillo并将它们返回给R.而不需要编写额外的代码行,也没有可识别的开销。

答案 1 :(得分:1)

可以使用reinterpret_cast将一种类型强制转换为其他类型。通常这是一个坏主意,但如果你能保证两种复杂类型确实兼容,你可以这样做:

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

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

shorthand