RcppArmadillo 中的两个向量是否相等?
Two vector equal in RcppArmadillo?
在我的函数中,我想使用==来比较矩阵中的行,但是它不起作用。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double accept(arma::mat x){
int b=x.n_rows;
arma::vec B(b-1);B.zeros();
for(int i=0;i<b-1;i++){
arma::rowvec a1;arma::rowvec a2;
if(x.row(i)==x.row(i+1)){
B[i]=0;
}else{
B[i]=1;
}
}
double bb;bb=sum(B)/(b-1);
return(bb);
}
错误信息:
c:/Rtools/mingw_64/bin/g++ -std=gnu++11 -I"C:/Users/songxl/DOCUME~1/R/R-35~1.0RC/include" -DNDEBUG -I../inst/include -fopenmp -I"C:/Users/songxl/Documents/R/R-3.5.0rc/library/Rcpp/include" -I"C:/Users/songxl/Documents/R/R-3.5.0rc/library/RcppArmadillo/include" -I"E:/adptive/block" -O2 -Wall -mtune=generic -c acp.cpp -o acp.o
acp.cpp: In function 'double accept(arma::mat)':
acp.cpp:10:16: error: could not convert 'arma::operator==(const T1&, const T2&) [with T1 = arma::subview_row; T2 = arma::subview_row; typename arma::enable_if2<(arma::is_arma_type::value && arma::is_arma_type::value), const arma::mtGlue >::result = const arma::mtGlue, arma::subview_row, arma::glue_rel_eq>](((const arma::subview_row)(& arma::Mat::row(arma::uword) [with eT = double; arma::uword = unsigned int](((arma::uword)(i + 1))))))' from 'arma::enable_if2, arma::subview_row, arma::glue_rel_eq> >::result {aka const arma::mtGlue, arma::subview_row, arma::glue_rel_eq>}' to 'bool'
if(x.row(i)==x.row(i+1)){
^
make: *** [acp.o] Error 1
看来相等比较不起作用。 (关于为什么这对浮点来说很难,有一个很长的故事,请参阅 what every computer scientist should know about floating point。)
所以我重写为sum(abs(diff(a1,a2))) < eps
;随意使用不同的 epsilon 值:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double accept(arma::mat x){
int b = x.n_rows;
arma::vec B(b-1);
B.zeros();
for (int i=0;i<b-1;i++){
arma::rowvec a1 = x.row(i);
arma::rowvec a2 = x.row(i+1);
if (sum(abs(a1-a2)) < 1e-8) {
B[i]=0;
}else{
B[i]=1;
}
}
double bb = sum(B) / (b-1);
return(bb);
}
否则你们就很接近了。
我建议使用内置的 arma::approx_equal() 函数,而不是使用 Dirk 的缩减技术,正如@mtall 所规避的那样。
这里的想法是检查这些值是否在容差定义的 epsilon 邻域内。例如,让标量 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
在我的函数中,我想使用==来比较矩阵中的行,但是它不起作用。
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double accept(arma::mat x){
int b=x.n_rows;
arma::vec B(b-1);B.zeros();
for(int i=0;i<b-1;i++){
arma::rowvec a1;arma::rowvec a2;
if(x.row(i)==x.row(i+1)){
B[i]=0;
}else{
B[i]=1;
}
}
double bb;bb=sum(B)/(b-1);
return(bb);
}
错误信息:
c:/Rtools/mingw_64/bin/g++ -std=gnu++11 -I"C:/Users/songxl/DOCUME~1/R/R-35~1.0RC/include" -DNDEBUG -I../inst/include -fopenmp -I"C:/Users/songxl/Documents/R/R-3.5.0rc/library/Rcpp/include" -I"C:/Users/songxl/Documents/R/R-3.5.0rc/library/RcppArmadillo/include" -I"E:/adptive/block" -O2 -Wall -mtune=generic -c acp.cpp -o acp.o acp.cpp: In function 'double accept(arma::mat)': acp.cpp:10:16: error: could not convert 'arma::operator==(const T1&, const T2&) [with T1 = arma::subview_row; T2 = arma::subview_row; typename arma::enable_if2<(arma::is_arma_type::value && arma::is_arma_type::value), const arma::mtGlue >::result = const arma::mtGlue, arma::subview_row, arma::glue_rel_eq>](((const arma::subview_row)(& arma::Mat::row(arma::uword) [with eT = double; arma::uword = unsigned int](((arma::uword)(i + 1))))))' from 'arma::enable_if2, arma::subview_row, arma::glue_rel_eq> >::result {aka const arma::mtGlue, arma::subview_row, arma::glue_rel_eq>}' to 'bool' if(x.row(i)==x.row(i+1)){ ^ make: *** [acp.o] Error 1
看来相等比较不起作用。 (关于为什么这对浮点来说很难,有一个很长的故事,请参阅 what every computer scientist should know about floating point。)
所以我重写为sum(abs(diff(a1,a2))) < eps
;随意使用不同的 epsilon 值:
#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]
using namespace Rcpp;
// [[Rcpp::export]]
double accept(arma::mat x){
int b = x.n_rows;
arma::vec B(b-1);
B.zeros();
for (int i=0;i<b-1;i++){
arma::rowvec a1 = x.row(i);
arma::rowvec a2 = x.row(i+1);
if (sum(abs(a1-a2)) < 1e-8) {
B[i]=0;
}else{
B[i]=1;
}
}
double bb = sum(B) / (b-1);
return(bb);
}
否则你们就很接近了。
我建议使用内置的 arma::approx_equal() 函数,而不是使用 Dirk 的缩减技术,正如@mtall 所规避的那样。
这里的想法是检查这些值是否在容差定义的 epsilon 邻域内。例如,让标量 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