gpt4 book ai didi

c++ - 在不创建 vector 的情况下检查 Rcpp 中的非有限值

转载 作者:行者123 更新时间:2023-11-30 03:17:53 25 4
gpt4 key购买 nike

我还没有编写 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”是一个 vector ,“n”是这个 vector 的长度。 “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

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

最佳答案

简而言之,您可以检查一个值是否是有限的,例如不是 NaNInf-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);
}

关于c++ - 在不创建 vector 的情况下检查 Rcpp 中的非有限值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55148827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com