Вместо использования техники сокращения Дирка, я бы порекомендовал использовать встроенную функцию arma :: ок_эквивалентности () , к которой не применимо @ mtall.
Идея в том, чтобы проверить, находятся ли значения в окрестности эпсилона, определенной допуском. Например, пусть скаляры x
и y
считаются равными, если |x − y| ≤ tol
.
Пример реализации
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::export]]
double accept(arma::mat x){
int b = x.n_rows;
arma::vec B = arma::zeros<arma::vec>(b-1);
for(int i = 0; i < b - 1; ++i){
bool same_vec = approx_equal(x.row(i), x.row(i+1), "absdiff", 0.002);
if(same_vec) {
B[i] = 0;
} else {
B[i] = 1;
}
}
double bb = sum(B)/(b-1);
return bb;
}
Тест:
x = matrix(rep(1:10, 2), ncol = 2)
accept(x)
# [1] 1