在不创建向量的情况下检查RCPP中的非限制值

Checking non-finite values in Rcpp without creating a vector

本文关键字:RCPP 检查 创建 向量 情况下      更新时间:2023-10-16

我尚未编写RCPP代码以执行与时间序列相关的计算:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
double AmiA(arma::vec ts, int n, double cf, double h, double g) {

  double sumA = log(cf);
  double temp;

  for (int i=1; i < n; i++) {
    temp = cf;
    for (int j=0; j<i; j++) {
      temp +=  pow(ts[i]-ts[j]+h, g);
    }
    sumA += log(temp);
  }
  return(sumA);
}

在这里," ts"是向量," n"是该向量的长度。" CF"," H"answers" G"是常数。

为了使代码更快,我声明了双temp,然后为每个观察结果,我将部分添加了pow(ts[i]-ts[j]+h, g)。现在进行一些观察;该部分pow(ts[i]-ts[j]+h, g)给出NAN值。这可以通过:

获得
n = 100; ts = sort(runif(n)); cf=1.4; h=0.5; g=2.3
AmiA(ts, n, cf, h, g)
# [1] 307.0836

如何在不创建向量并检查该向量的值的情况下检查这些值?任何想法都将不胜感激。

简而言之,您可以检查一个值是有限的,例如通过使用arma::is_finite(),不是NaNInf-Inf注意:在仅使用 rcpp 的情况下,请使用bool finiteness = Rcpp::is_finite(x)[0]检查Rcpp::is_finite()返回LogicalVector

示例实现:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
double AmiA(arma::vec ts, int n, double cf, double h, double g) {

    double sumA = log(cf);
    double temp;

    for (int i=1; i < n; i++) {
        temp = cf;
        for (int j=0; j<i; j++) {
            // Compute value
            result = pow(ts[i]-ts[j]+h, g);
            // Guard against non-finite values
            if(arma::is_finite(result)){
                temp +=  result
            }
        }
        sumA += log(temp);
    }
    return(sumA);
}