我正在尝试从通过元素方式'&'连接的其他两个逻辑向量中获取逻辑向量:
//[[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);
^
我不知道发生了什么事。我猜Armadillo的处理方式有所不同。但是我找不到任何资料来帮助我清除问题。任何帮助,将不胜感激!非常感谢你!
答案 0 :(得分:3)
我不知道发生了什么事。我猜Armadillo的处理方式有所不同。但是我找不到任何资料可以帮助我清除问题。
此处的最终来源是the Armadillo docs。如果转到the section on operators,您会发现&
运算符不是 Mat,Col,Row 的“ [o]个已满运算符”中列出的运算符之一和 Cube 类。”因此,如果您想要这样的运营商,则必须自己进行编码(或者查看是否有人已经在Internet上浮动了它)。 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在评论中指出,&&
运算符实际上可用,即使Armadillo文档中没有对此进行讨论(也许不是最终的。我认为是一个来源。
因此,只需将代码更改为以下内容即可:
#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