在 Rcpp(和 RcppArmadillo)中,如何检查 vec 是否包含复数?
In Rcpp (and RcppArmadillo), how to check if a vec contains complex numbers?
在 R 中,我们可以使用 is.complex(例如 is.complex(vec1)
)检查向量(例如 vec1=c(1+1i,2)
)是否包含复数。我想知道 RcppArmadillo 中的等效函数是什么?
以及如何在 RcppArmadillo 中提取向量中每个元素的实部,就像 R 中的 Re(vec1)
?
要提取实部和虚部,您可以使用 arma::real()
和 arma::imag()
函数。或者,您可以使用糖函数 Rcpp::Re()
和 Rcpp::Im()
:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec getRe(arma::cx_vec x) {
return arma::real(x);
}
// [[Rcpp::export]]
Rcpp::NumericVector getIm(Rcpp::ComplexVector x) {
return Rcpp::Im(x);
}
/*** R
set.seed(42)
N <- 5
vec <- complex(5, rnorm(5), rnorm(5))
t(getRe(vec))
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] -0.9390771 -0.04167943 0.8294135 -0.4393582 -0.3140354
Re(vec)
#> [1] -0.93907708 -0.04167943 0.82941349 -0.43935820 -0.31403543
getIm(vec)
#> [1] -2.1290236 2.5069224 -1.1273128 0.1660827 0.5767232
Im(vec)
#> [1] -2.1290236 2.5069224 -1.1273128 0.1660827 0.5767232
*/
如果你使用上面的getRe(arma::vec x)
,你会得到:
Warning message:
In getRe(vec) : imaginary parts discarded in coercion
你不能把复数放在一个不打算存储它们的对象中。这是 C++ 是一种强类型语言的结果。所以不需要 is.complex()
.
的类似物
参阅 Armadillo documentation 进一步参考。
在 R 中,我们可以使用 is.complex(例如 is.complex(vec1)
)检查向量(例如 vec1=c(1+1i,2)
)是否包含复数。我想知道 RcppArmadillo 中的等效函数是什么?
以及如何在 RcppArmadillo 中提取向量中每个元素的实部,就像 R 中的 Re(vec1)
?
要提取实部和虚部,您可以使用 arma::real()
和 arma::imag()
函数。或者,您可以使用糖函数 Rcpp::Re()
和 Rcpp::Im()
:
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
// [[Rcpp::export]]
arma::vec getRe(arma::cx_vec x) {
return arma::real(x);
}
// [[Rcpp::export]]
Rcpp::NumericVector getIm(Rcpp::ComplexVector x) {
return Rcpp::Im(x);
}
/*** R
set.seed(42)
N <- 5
vec <- complex(5, rnorm(5), rnorm(5))
t(getRe(vec))
#> [,1] [,2] [,3] [,4] [,5]
#> [1,] -0.9390771 -0.04167943 0.8294135 -0.4393582 -0.3140354
Re(vec)
#> [1] -0.93907708 -0.04167943 0.82941349 -0.43935820 -0.31403543
getIm(vec)
#> [1] -2.1290236 2.5069224 -1.1273128 0.1660827 0.5767232
Im(vec)
#> [1] -2.1290236 2.5069224 -1.1273128 0.1660827 0.5767232
*/
如果你使用上面的getRe(arma::vec x)
,你会得到:
Warning message:
In getRe(vec) : imaginary parts discarded in coercion
你不能把复数放在一个不打算存储它们的对象中。这是 C++ 是一种强类型语言的结果。所以不需要 is.complex()
.
参阅 Armadillo documentation 进一步参考。