将R复杂对象传递给armadillo c++

pass R complex object to armadillo C++

本文关键字:armadillo c++ 复杂 对象      更新时间:2023-10-16

R使用,当与其他语言接口时,头R_ext/Complex.h包括类型Rcomplex,这似乎是std::complex<double>的实现。使用它的标准方法是对于R中的复向量x_: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

你有任何线索传递一个复杂的向量在R到std::complex<double> type ?我知道Rcpp,但希望有一个直接的解决方案依赖于基础r

编辑:在其中一个评论之后,我想澄清RcomplexC类型,但根据@Stephen Canon的回答,它与std::complex<double>兼容。

EDIT2:如果Dirk的答案没有回答"无依赖"的问题,为什么它比公认的答案有更多的投票?此外,我显然被否决了,因为如果有人想更好地使用基础R与C或c++,有人不喜欢它。无论如何,我有更好的事情要做,但这不是第一次,我没有得到我的原始问题的答案,当问一些与基础R与C或c++接口相关的东西,并得到一个Rcpp相关的答案,我没有要求。

复数在统计学中不太常见,因此这不是最初的重点。然而,在一些用例中,Baptiste有一两个包,可以在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。无需编写额外的代码,也没有明显的开销。

可以使用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>

的简写。