RcppArmadillo和C ++部门问题

时间:2016-05-02 15:27:37

标签: rcpp armadillo

关于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
}

1 个答案:

答案 0 :(得分:3)

啊,好的ol' {+ 1}}与C ++中的integer除法问题。在开始之前,请注意:double默认为arma::vecdouble110都是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)