将R复杂对象传递给armadillo c++
pass R complex object to armadillo C++
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
编辑:在其中一个评论之后,我想澄清Rcomplex
是C
类型,但根据@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_double
是std::complex<double>
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 矩阵rowSums()与colSums(()在R与Rcpp与Armadillo中的效率
- Armadillo正在为共享的lapack库获取未定义的参考
- 如何在Visual Studio中并行化armadillo
- r-(C ,Armadillo)从矩阵中更换列矢量的一部分
- Armadillo是否支持布尔和8位型矩阵和立方体
- R- armadillo c :用其他两个向量对向量进行排序
- 将矩阵划分为Armadillo中的载体
- 将行附加到Armadillo .mat文件
- 使用高级构造函数将阵列转换为Armadillo Vec
- C :结构内部的Armadillo矩阵
- C 中矩阵的动态名称(Armadillo库)
- Armadillo节省双精度ASCII
- 是c armadillo find()输出排序
- 模板实例化与Armadillo和Boost :: Numeric :: Odeint
- Armadillo C :如何使用来自另一个矩阵的多个元素(特别是在立方体结构中)修改矩阵的多个数组元素
- 用Armadillo功能替换“稀疏”
- Armadillo CPP:3D字段的访问切片
- 如何向armadillo(C++)发送一个numpy数组,并从armadillo返回一个numdy数组
- 使用Armadillo和MKL库构建x86(win32)