将 R 复合体 object 传递给犰狳 C++
pass R complex object to armadillo C++
R 在与其他语言交互时使用 header 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
类型,但根据 answer 它与 std::complex<double>
兼容通过@Stephen Canon。
EDIT2:如果 Dirk 的回答没有回答 "without dependencies" 问题,为什么它的票数比已接受的答案多。此外,我显然被否决了,因为如果有人希望最好将 base R 与 C 或 C++ 一起使用,那么有人会不喜欢它。无论如何,我有更好的事情要做,但这不是我第一次在询问与 C 或 C++ 的 base R 接口相关的问题时没有得到我的原始问题的答案并得到我没有的 Rcpp
相关答案要求。
总是可以使用 reinterpret_cast 将一种类型强制转换为另一种类型。通常这是一个坏主意,但如果你能保证这两个复杂类型确实兼容,你可以这样做:
Rcomplex* px = COMPLEX(x_);
arma::cx_vec x( reinterpret_cast<arma::cx_double*>(px), nrows(x_), false, false );
类型 arma::cx_double
是 shorthand for std::complex<double>
复数在统计学中不太常见,因此这并不是最初的重点。然而,有一些用例 Baptiste 有 one or 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。无需编写额外的代码行,也没有明显的开销。
R 在与其他语言交互时使用 header 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
类型,但根据 answer 它与 std::complex<double>
兼容通过@Stephen Canon。
EDIT2:如果 Dirk 的回答没有回答 "without dependencies" 问题,为什么它的票数比已接受的答案多。此外,我显然被否决了,因为如果有人希望最好将 base R 与 C 或 C++ 一起使用,那么有人会不喜欢它。无论如何,我有更好的事情要做,但这不是我第一次在询问与 C 或 C++ 的 base R 接口相关的问题时没有得到我的原始问题的答案并得到我没有的 Rcpp
相关答案要求。
总是可以使用 reinterpret_cast 将一种类型强制转换为另一种类型。通常这是一个坏主意,但如果你能保证这两个复杂类型确实兼容,你可以这样做:
Rcomplex* px = COMPLEX(x_);
arma::cx_vec x( reinterpret_cast<arma::cx_double*>(px), nrows(x_), false, false );
类型 arma::cx_double
是 shorthand for std::complex<double>
复数在统计学中不太常见,因此这并不是最初的重点。然而,有一些用例 Baptiste 有 one or 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。无需编写额外的代码行,也没有明显的开销。