C++ 在不创建向量的情况下检查Rcpp中的非有限值
我还没有编写Rcpp代码来执行与时间序列相关的计算:C++ 在不创建向量的情况下检查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 <
#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);
}
如何在不创建向量并检查该向量的值的情况下检查这些值?任何想法都将受到欢迎。简而言之,您可以使用
arma::is_finite()
检查值是否是有限的,例如非NaN
、Inf
或-Inf
注意:如果只使用Rcpp,请使用bool finiteness=Rcpp::is_finite(x)[0]
asRcpp::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);
}
#包括
//[[Rcpp::depends(RcppArmadillo)]]
//[[Rcpp::导出]]
双AmiA(arma::向量ts,整数n,双cf,双h,双g){
双sumA=对数(cf);
双温;
对于(int i=1;i 对于(int j=0;j@coatless这里,ts=sort(runif(100));cf=1.4;h=0.5;g=2。3@coatless,为了产生一个可复制的例子,我给出了那个例子。但是如果我得到NaN值,我怎么能在不创建向量的情况下检查它呢,如果数据中缺少值或x
在log()中为负值,则会触发此操作
@coatless,您是否建议创建一个向量并填充每个条目,检查它是否给出了有限值,然后只对有限值求和?您可以在将结果添加到缩减变量之前检查结果,例如result=pow(ts[i]-ts[j]+h,g);if(is_finite(result)){temp+=result;}
#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);
}