我还没有编写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
如何在不创建向量并检查该向量值的情况下检查这些值?任何想法将不胜感激。
答案 0 :(得分:2)
简而言之,您可以检查一个值是否是有限的,例如使用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);
}