C++ (Rcpp)armadillos abs()函数与c+一起使用时输出假值+;std::abs工作时加倍
考虑一下这个R函数:C++ (Rcpp)armadillos abs()函数与c+一起使用时输出假值+;std::abs工作时加倍,c++,r,rcpp,armadillo,rcpparmadillo,C++,R,Rcpp,Armadillo,Rcpparmadillo,考虑一下这个R函数: r_abs <- function(x,y,z){ 2 * abs((x >= y) - z) } r_abs=y)-z) } 以及这两种RcppArmadillo等效物: // [[Rcpp::depends(RcppArmadillo)]] // [[Rcpp::depends(RcppProgress)]] #include <RcppArmadillo.h> #include <string> #include <
r_abs <- function(x,y,z){
2 * abs((x >= y) - z)
}
r_abs=y)-z)
}
以及这两种RcppArmadillo等效物:
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(RcppProgress)]]
#include <RcppArmadillo.h>
#include <string>
#include <progress.hpp>
using namespace arma;
// [[Rcpp::export]]
double arma_abs(const double &x, const double &y, const double &z)
{
return 2 * abs((x >= y) - z);
}
// [[Rcpp::export]]
double std_abs(const double &x, const double &y, const double &z)
{
return 2 * std::abs((x >= y) - z);
}
/[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::依赖(RcppProgress)]]
#包括
#包括
#包括
使用arma;
//[[Rcpp::导出]]
双arma_abs(常数双x、常数双y、常数双z)
{
返回2*abs((x>=y)-z);
}
//[[Rcpp::导出]]
双标准abs(常数双和x、常数双和y、常数双和z)
{
返回2*std::abs((x>=y)-z);
}
现在问题来了:
sourceCpp(".test/test.cpp")
x <- 1
y <- 2
z <- 0.5
r_abs(x,y,z)
[1] 1
arma_abs(x, y, z)
[1] 0
std_abs(x, y, z)
[1] 1
sourceCpp(“.test/test.cpp”)
x> p>这是一个棘手的问题,有点冗长乏味的问题,C++和C++部分被CORDREST <代码>:STD::ABS-(< /代码>)最近添加了。
如果您使用的是Unix系统,请尝试man 3 abs
。使用(非限定的)abs()
相当于::abs()
,它从stdlib.h
获得int abs(int)
转换为int
会使参数-0.5截断为零,其乘以2仍然为零。简而言之,arma
与此无关。(Armadillo通常只具有向量、矩阵、立方体等类型的函数,而不是原子C/C++类型,如double
)
为了完整起见,我的代码版本中嵌入了下面的R部分。我删除了未使用的引用RcppProgress
// [[Rcpp::depends(RcppArmadillo)]]
#include <RcppArmadillo.h>
//using namespace arma;
// [[Rcpp::export]]
double arma_abs(const double &x, const double &y, const double &z) {
auto val = (x >= y) - z;
Rcpp::Rcout << "val " << val << std::endl;
Rcpp::Rcout << "int(val) " << int(val) << std::endl;
return 2 * ::abs((x >= y) - z);
}
// [[Rcpp::export]]
double std_abs(const double &x, const double &y, const double &z) {
return 2 * std::abs((x >= y) - z);
}
/*** R
r_abs <- function(x,y,z){
2 * abs((x >= y) - z)
}
x <- 1
y <- 2
z <- 0.5
r_abs(x,y,z) # 1
arma_abs(x, y, z) # 0
std_abs(x, y, z) # 1
*/
/[[Rcpp::depends(RcppArmadillo)]]
#包括
//使用arma;
//[[Rcpp::导出]]
双arma_abs(常数双x、常数双y、常数双z){
自动值=(x>=y)-z;
Rcpp::Rcout