在与其他语言交互时,R使用包含R_ext/Complex.h
类型的标头Rcomplex
,std::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。
编辑:根据其中一条评论,我想澄清C
属std::complex<double>
类型,但根据answer @ Rcpp
与ionic2@RC.0
兼容斯蒂芬佳能。
EDIT2:如果没有回答“没有依赖性”的问题,为什么Dirk的答案会比接受的答案拥有更多的选票。另外,我显然是因为如果一个人希望最好使用带有C或C ++的基础R,那么有人不喜欢它。无论如何,我有更好的事情要做,但这并不是我第一次在询问与R或C或C ++接口相关的内容时得不到我的原始问题的答案,并获得rollup
相关的答案我没有要求。
答案 0 :(得分:4)
复杂数字在统计数据中不常见,所以这不是最初的焦点。但是有一些用例Baptiste有one或two个软件包,在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_double
是std::complex<double>