#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);
}