【问题标题】:pass R complex object to armadillo C++将 R 复杂对象传递给犰狳 C++
【发布时间】:2017-02-07 09:41:42
【问题描述】:

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 的直接解决方案。

编辑:在其中一个 cmets 之后,我想澄清 Rcomplex 属于 C 类型,但根据 @Stephen Canon 的 answer,它与 std::complex<double> 兼容。

EDIT2:如果 Dirk 的答案没有回答“无依赖关系”问题,为什么它的投票数比接受的答案多。此外,我显然被否决了,因为如果有人想最好将基本 R 与 C 或 C++ 一起使用,那么有人不喜欢它。无论如何,我有更好的事情要做,但这不是我第一次在询问与基本 R 与 C 或 C++ 接口相关的问题时没有得到原始问题的答案,并得到了我没有要求的 Rcpp 相关答案.

【问题讨论】:

  • 您是否有不想使用 RcppArmadillo 的具体原因?
  • @Roland 对于简单的事情,我通常更喜欢避免依赖,我的功能非常简单,但我想加快速度。
  • @nopeva:这就是所谓的重新发明轮子。按照同样的逻辑,你不会使用犰狳。或 R。
  • 你的前提也是错误的:这似乎是 std::complex 的实现。当然不是,因为 R 仅在 C 中实现,而不在 C++ 中实现。
  • Dirk Eddelbuettel@ 在Rcomplexdouble complex 类型的意义上,你是对的。但是,std::complex<double>type 已经过精心开发以使其兼容。见link

标签: c++ r armadillo


【解决方案1】:

复杂的数字在统计中不太常见,因此这不是最初的重点。然而,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。无需编写额外的代码行,也没有明显的开销。

【讨论】:

    【解决方案2】:

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

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

    arma::cx_double 类型是 shorthandstd::complex&lt;double&gt;

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2011-01-31
      相关资源
      最近更新 更多