Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ (Rcpp)armadillos abs()函数与c+一起使用时输出假值+;std::abs工作时加倍_C++_R_Rcpp_Armadillo_Rcpparmadillo - Fatal编程技术网

C++ (Rcpp)armadillos abs()函数与c+一起使用时输出假值+;std::abs工作时加倍

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函数:

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