Rcpp程序中的最小值和最大值

Gio*_*ato 4 r rcpp

我正在将R函数转换为Rcpp函数.一切都很好,但我在使用标准的最大和最小功能方面遇到了困难.代码如下:

#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;
}
Run Code Online (Sandbox Code Playgroud)

返回错误"没有matchinf函数用于调用min(int,&double).如果可能的话,我会lioke使用std :: library min函数

nru*_*ell 10

只需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;
}
Run Code Online (Sandbox Code Playgroud)

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

template <class T> const T& min (const T& a, const T& b);
Run Code Online (Sandbox Code Playgroud)

它只用一种类型(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;
}
Run Code Online (Sandbox Code Playgroud)

我猜测类型演绎operator<比弹性更灵活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;
}
Run Code Online (Sandbox Code Playgroud)

虽然在这种情况下,它只是更容易改变11.0不是(不必要地)定义int z只是为了将其转换为双倍.

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