Проверка неконечных значений в Rcpp без создания вектора - PullRequest
0 голосов
/ 13 марта 2019

Я написал код 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 Ответ

2 голосов
/ 14 марта 2019

Короче говоря, вы можете проверить, является ли значение конечным, например, не NaN, Inf или -Inf, используя arma::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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...