在不创建向量的情况下检查RCPP中的非限制值
Checking non-finite values in Rcpp without creating a vector
我尚未编写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"answers" 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
如何在不创建向量并检查该向量的值的情况下检查这些值?任何想法都将不胜感激。
简而言之,您可以检查一个值是有限的,例如通过使用arma::is_finite()
,不是NaN
,Inf
或-Inf
。注意:在仅使用 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);
}
相关文章:
- valgrind-hellgrind与泄漏检查的结果不同
- C++模板来检查友元函数的存在
- 检查输入是否不是整数或数字
- 试图让变量检查数组中的某些内容
- 检查值是否在集合p1和p2中,但不在p3中
- C++概念:如何使用'concept'检查模板化结构的属性?
- 概念TS检查忽略私有访问修饰符
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- 如何在C++中检查2D数组中负值的输入验证
- C++:正在检查LinkedList中的回文-递归方法-错误
- 使用for循环检查数组中的重复项
- 如何使用Rcpp将R函数转换为C++函数
- rcpp函数中的清理时间很长
- 如何检查一个c++字符串中有多少相同的字符/数字
- 检查不带转换的扫描格式
- 如何检查线程是否锁定
- 在Rcpp(和RcppArmadillo)中,如何检查vec是否包含复数
- 在不创建向量的情况下检查RCPP中的非限制值
- Rcpp如何检查矢量/矩阵边界