Rcpp 程序中的最小值和最大值
min and max in Rcpp programs
我正在将 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;
}
返回错误“没有用于调用 min(int, &double) 的 matchinf 函数。如果可能,我希望使用 std:: library min 函数
只需将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
) 定义,而您向其传递了两种数据类型(int
和 double
)。
或者由于您只是比较两个值,您可以通过将 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<
的类型推导比 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
只是为了稍后将其转换为双精度要容易得多。
您可以通过阅读函数/class 定义(与大多数编程语言一样)学到很多东西 - cplusplus.com and cppreference.com 是非常标准的来源 - 它通常会使编译器错误看起来不那么神秘.
我正在将 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;
}
返回错误“没有用于调用 min(int, &double) 的 matchinf 函数。如果可能,我希望使用 std:: library min 函数
只需将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
) 定义,而您向其传递了两种数据类型(int
和 double
)。
或者由于您只是比较两个值,您可以通过将 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<
的类型推导比 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
只是为了稍后将其转换为双精度要容易得多。
您可以通过阅读函数/class 定义(与大多数编程语言一样)学到很多东西 - cplusplus.com and cppreference.com 是非常标准的来源 - 它通常会使编译器错误看起来不那么神秘.