首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RcppArmadillo和C++划分问题

RcppArmadillo和C++划分问题
EN

Stack Overflow用户
提问于 2016-05-02 23:27:37
回答 1查看 746关注 0票数 0

关于RcppArmadillo的一个非常简单的问题。尝试将一个向量乘以一个标量,并根据语法中的微小变化得到不同的结果。

有什么想法吗?

代码语言:javascript
复制
// [[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
}
EN

回答 1

Stack Overflow用户

发布于 2016-05-03 00:45:50

啊,好的老integer与C++中的double除法问题。在开始之前,请注意:默认情况下,arma::vec是一个double,而1101/10都是int...

让我们单独来看一下你的函数:

代码语言:javascript
复制
#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
}

因此,当我们遍历你的问题时,我们得到:

代码语言:javascript
复制
> 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)显式地将值转换为双精度值

例如:

代码语言:javascript
复制
// [[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
}

会给出你所期望的:

代码语言:javascript
复制
> funtemp_four(1)
     [,1]
[1,]  0.1

> funtemp_five(1)
     [,1]
[1,]  0.1
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36986097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档