为什么'&'运算符在 RcppArmadillo 中不起作用
Why is '&' operator not working in RcppArmadillo
我正在尝试从通过按元素“&”连接的另外两个逻辑向量中获取一个逻辑向量:
//[[Rcpp::export]]
arma::uvec test1(arma::vec t1, double R1, double R2){
arma::uvec t = (t1 >= R1) & (t1 < R2);
return t;
}
它 returns 我尝试编译时出现以下错误
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);
^
我不知道发生了什么。我猜犰狳做事的方式不同。但是我找不到任何资源来帮助我解决问题。任何帮助,将不胜感激!非常感谢!
I have no idea what was going on. I am guessing that Armadillo does things differently. But I can't find any sources to help me clear things out.
这里的最终来源是 the Armadillo docs. If you go down to the section on operators,您会看到 &
运算符不是“Mat 的 [o] 重载运算符, Col、Row 和 Cube 类。”所以,如果你想要这样的操作员,你必须自己编写代码(或者看看其他人是否已经在互联网上发布了它)。 Rcpp::NumericVector
s 有这样一个运算符:
#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
我正在尝试从通过按元素“&”连接的另外两个逻辑向量中获取一个逻辑向量:
//[[Rcpp::export]]
arma::uvec test1(arma::vec t1, double R1, double R2){
arma::uvec t = (t1 >= R1) & (t1 < R2);
return t;
}
它 returns 我尝试编译时出现以下错误
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);
^
我不知道发生了什么。我猜犰狳做事的方式不同。但是我找不到任何资源来帮助我解决问题。任何帮助,将不胜感激!非常感谢!
I have no idea what was going on. I am guessing that Armadillo does things differently. But I can't find any sources to help me clear things out.
这里的最终来源是 the Armadillo docs. If you go down to the section on operators,您会看到 &
运算符不是“Mat 的 [o] 重载运算符, Col、Row 和 Cube 类。”所以,如果你想要这样的操作员,你必须自己编写代码(或者看看其他人是否已经在互联网上发布了它)。 Rcpp::NumericVector
s 有这样一个运算符:
#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