关于RcppArmadillo的一个非常简单的问题。尝试将矢量乘以标量,并根据语法的微小变化获得不同的结果。
有什么想法吗?
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
arma::vec funtemp(arma::vec x)
{
// return(x/10); // this works
// return((1/10)*x); // this does not work
return(x*(1/10)); // this does not work
}
答案 0 :(得分:3)
integer
除法问题。在开始之前,请注意:double
默认为arma::vec
,double
,1
,10
都是1/10
...
让我们分别看一下你的功能:
int
因此,当我们解决您的问题时,我们得到:
#include <RcppArmadillo.h>
// [[Rcpp::depends("RcppArmadillo")]]
// [[Rcpp::export]]
arma::vec funtemp_one(arma::vec x)
{
return(x/10); // this works
}
// [[Rcpp::export]]
arma::vec funtemp_two(arma::vec x)
{
return((1/10)*x); // this does not work
}
// [[Rcpp::export]]
arma::vec funtemp_three(arma::vec x)
{
return(x*(1/10)); // this does not work
}
在后面的函数中(例如> funtemp_one(1)
[,1]
[1,] 0.1
> funtemp_two(1)
[,1]
[1,] 0
> funtemp_three(1)
[,1]
[1,] 0
),正在使用的1/10
是基于operator/
的除法。结果,返回2 int
s并返回1 int
。如果结果不可分,那么最终会返回零,因为它在整数范围之外。
为了使用返回double的double版本,必须至少将其中一个int
显式转换为int
。默认情况下会出现这种情况,因为double
的{{1}}结构导致double
/ int
。第二个和第三个案例具有arma::vec
结构,可以通过两种方式处理:1。在int/int
之后使用.0
或2.使用{显式地将值转换为double {1}}
e.g。
int
会给出你期望的东西:
double(int)