【问题标题】:min and max in Rcpp programsRcpp 程序中的最小值和最大值
【发布时间】:2015-01-06 23:06:23
【问题描述】:

我正在将 R 函数转换为 Rcpp 函数。一切都很好,但我在使用标准的 max 和 min 函数时遇到了困难。下面的代码:

#include <math.h>
#include <RcppArmadillo.h>
#include <algorithm>
#include <iostream>

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
using namespace arma;
using namespace std;

double f4RandomC(double x, double a, double b) {
  double out, temp;

  temp=(log( (a*(1-x)) / (a+x) )) /log(b) ;
  out= std::min(1,temp );
  return out;
}

返回错误“调用 min(int, &double) 时没有 matchinf 函数。如果可能,我想使用 std:: library min 函数

【问题讨论】:

    标签: r rcpp


    【解决方案1】:

    只需将std::min(1,temp) 更改为std::min(1.0,temp)

    #include <cmath>
    #include <Rcpp.h>
    // [[Rcpp::export]]
    double f4RandomC(double x, double a, double b) {
      double out, temp;
    
      temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
      out = std::min(1.0,temp );
      return out;
    }
    

    我假设这与std::min 的模板定义有关

    template <class T> const T& min (const T& a, const T& b);
    

    它仅根据一种类型 (T) 定义,而您传递给它的是两种数据类型(intdouble)。

    或者由于您只比较两个值,您可以通过将std::min 替换为三元运算符 (?:) 来更简洁地执行此操作:

    double f4RandomC(double x, double a, double b) {
      double temp;
    
      temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
      return temp < 1 ? temp : 1;
    }
    

    我猜operator&lt; 的类型推导比std::min 更灵活。

    std::min 的另外两个选项:

    // [[Rcpp::export]]
    double f4RandomC2(double x, double a, double b) {
      double out, temp;
      int z = 1;
      temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
      out = std::min( static_cast<double>(z),temp );
      return out;
    }
    
    // [[Rcpp::export]]
    double f4RandomC3(double x, double a, double b) {
      double out, temp;
      int z = 1;
      temp =(log( (a*(1-x)) / (a+x) )) /log(b) ;
      out = std::min<double>( z,temp );
      return out;
    }
    

    尽管在这种情况下,将1 更改为1.0 肯定比(不必要地)定义int z 只是为了稍后将其转换为双精度。

    通过阅读函数/类定义(与大多数编程语言一样),您可以学到很多东西 - cplusplus.comcppreference.com 是相当标准的来源 - 它通常会使编译器错误看起来不那么神秘。

    【讨论】:

      猜你喜欢
      • 2012-10-09
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2023-04-02
      • 2015-12-24
      相关资源
      最近更新 更多