0

我正在尝试从通过元素“&”连接的其他两个逻辑向量中获取逻辑向量:

//[[Rcpp::export]]
arma::uvec test1(arma::vec t1, double R1, double R2){
arma::uvec t = (t1 >= R1) & (t1 < R2);
return t;
}

当我尝试编译时它返回以下错误

error: no match for 'operator&' (operand types are 'arma::enable_if2<true, const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_gteq_post> >::result {aka const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_gteq_post>}' and 'arma::enable_if2<true, const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_lt_post> >::result {aka const arma::mtOp<unsigned int, arma::Col<double>, arma::op_rel_lt_post>}')
arma::uvec t = (t1 >= R1) & (t1 < R2);
                          ^

我不知道发生了什么。我猜犰狳做事不同。但是我找不到任何资源来帮助我解决问题。任何帮助,将不胜感激!非常感谢!

4

1 回答 1

3

我不知道发生了什么。我猜犰狳做事不同。但是我找不到任何资源来帮助我解决问题。

这里的最终来源是犰狳文档。如果您转到有关操作符的部分,您会发现该&操作符不是“用于Mat、Col、RowCube类的[o]重载操作符”中列出的操作符之一。因此,如果您想要这样的操作员,您必须自己编写代码(或者查看其他人是否已经在互联网上发布了它)。s有这样一个运算符Rcpp::NumericVector

#include <Rcpp.h>

// [[Rcpp::export]]
Rcpp::LogicalVector test1(const Rcpp::NumericVector& t1, double R1, double R2){
    return (t1 >= R1) & (t1 < R2);
}
test1(1:10, 3, 7)
# [1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
# [9] FALSE FALSE

当然,如果您的其余代码确实依赖于 Armadillo,那也无济于事。

更新:只需使用&&

正如mtall在评论中指出的那样,该&&运算符实际上可用的,即使它没有在犰狳文档中讨论(也许它不像我想象的那样最终的来源)。

因此,只需将您的代码更改为以下内容:

#include <RcppArmadillo.h>
// [[Rcpp::depends(RcppArmadillo)]]

//[[Rcpp::export]]
arma::uvec test1(arma::vec t1, double R1, double R2){
    arma::uvec t = (t1 >= R1) && (t1 < R2);
    return t;
}

根据您的问题和对评论的回复,我相信您希望它可以正常工作:

test1(1:10, 3, 7)
      [,1]
 [1,]    0
 [2,]    0
 [3,]    1
 [4,]    1
 [5,]    1
 [6,]    1
 [7,]    0
 [8,]    0
 [9,]    0
[10,]    0
于 2019-09-28T11:24:14.520 回答