Проверка не конечных значений в Rcpp без создания вектора

#c #r #rcpp

#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» — это константы.

Чтобы ускорить код, я объявил double 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. @coatless Здесь ts= sort(runif(100)); cf=1.4; h= 0.5; g=2.3

2. @coatless, чтобы создать воспроизводимый пример, я привел этот пример. Но если я получу значения NaN; как я могу проверить это без создания вектора?

3. В терминах NaN (не числа) это срабатывает, если в данных отсутствуют значения или x внутри они отрицательные log() .

4. @coatless, вы предлагаете создать вектор и заполнить каждую запись и проверить, выдает ли он конечные значения, а затем суммировать только конечные значения?

5. Вы можете проверить результат перед добавлением его в переменную сокращения, например result = pow(ts[i]-ts[j] h, g); if(is_finite(result)) { temp = resu< }

Ответ №1:

Короче говоря, вы можете проверить, является ли значение конечным, например, not NaN , Inf или -Inf , используя arma::is_finite() . Примечание: В случаях, когда используется только Rcpp, проверка с помощью bool finiteness = Rcpp::is_finite(x)[0] as 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);
}