关于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
}发布于 2016-05-03 00:45:50
啊,好的老integer与C++中的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/是基于int的除法。结果,返回2个int的enter和1个int。如果结果是不可除的,那么您最终返回一个零,因为它超出了整数范围。
为了使用返回double的double版本,必须将至少一个int显式转换为double。这在第一种情况下默认发生,因为由于arma::vec的结构,你有一个double/int。第二种和第三种情况有一个int/int结构,可以通过两种方式处理: 1.在int之后使用.0或2.使用double(int)显式地将值转换为双精度值
例如:
// [[Rcpp::export]]
arma::vec funtemp_four(arma::vec x)
{
return(x*(1/10.0)); // this works
}
// [[Rcpp::export]]
arma::vec funtemp_five(arma::vec x)
{
return(x*(1/double(10))); // this works
}会给出你所期望的:
> funtemp_four(1)
[,1]
[1,] 0.1
> funtemp_five(1)
[,1]
[1,] 0.1https://stackoverflow.com/questions/36986097
复制相似问题