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

时间:2019-03-13 18:21:27

标签: c++ r rcpp

我还没有编写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”和“ 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

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

1 个答案:

答案 0 :(得分:2)

简而言之,您可以检查一个值是否是有限的,例如使用NaN而不是Inf-Infarma::is_finite()注意::如果仅使用 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);
}