为啥'&'运算符在 RcppArmadillo 中不起作用

Posted

技术标签:

【中文标题】为啥\'&\'运算符在 RcppArmadillo 中不起作用【英文标题】:Why is '&' operator not working in RcppArmadillo为什么'&'运算符在 RcppArmadillo 中不起作用 【发布时间】:2019-09-28 05:20:53 【问题描述】:

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

//[[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);
                          ^

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

【问题讨论】:

您的意思是 &amp;&amp; 而不是 &amp; 吗?运算符&amp;&amp;&amp; 具有完全不同的含义,即使它们看起来相关。 &amp;&amp; 表示“逻辑与”。 &amp; 表示“按位与”。尝试将您的代码更改为:arma::uvec t = (t1 &gt;= R1) &amp;&amp; (t1 &lt; R2); && 确实有效,但它没有给我正确的答案。我需要元素&。 && 似乎只是通过快捷方式选项。 @davidolohowski 当你的比较是双打时 elementwise 是什么意思? @duckmayr 对不起,我不够清楚。我希望结果是真或假的向量。但是 && 只给了我一个正确或错误的答案,这不是我想要的。但奇怪的是 && 没有编译问题,而 & 确实。 @davidolohowski 查看我的答案的更新——我认为它应该按照你的意愿工作 【参考方案1】:

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

这里的最终来源是the Armadillo docs。如果您转到the section on operators,您会发现&amp; 运算符不是“[o] Mat、Col、Row 的重载运算符之一Cube 类。”因此,如果您想要这样的操作员,您必须自己编写代码(或者查看其他人是否已经在互联网上发布了它)。 Rcpp::NumericVectors有这样一个算子:

#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,那也无济于事。

更新:只需使用&amp;&amp;

正如 mtall 在 cmets 中指出的那样,&amp;&amp; 运算符实际上可用的,即使它没有在 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;

根据您对 cme​​ts 的问题和回复,我相信它会按照您希望的方式工作:

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

【讨论】:

也许&amp;&amp;&amp; 之间存在混淆? @mtall 我相信是这样;这是我的第一个想法,我应该按照您在 cmets 中的建议尝试开关。然而,像傻瓜一样,我首先查看了文档,并没有看到列出的操作员。试过之后,我发现它有效。我想知道为什么 &amp;&amp; 运算符没有在文档中列出? @mtall 您是否愿意添加自己的答案:这个问题?如果没有,我会更新我的以包含您的建议。 @duckmayr 谢谢,它确实有效。这实际上是我自己的错误。我认为这是理所当然的,因为如果使用 &&,R 会产生一个单值布尔答案。实际上是我的代码的其他一些部分有一个导致问题的错误。道歉。

以上是关于为啥'&'运算符在 RcppArmadillo 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 && 运算符会产生第二个操作数的类型

为啥短原语有赋值运算符(&=、+=)但没有非赋值运算符(&、+)? [复制]

为啥 `bool?` 上没有解除短路运算符?

为啥 C/C++ 中没有 ^^ 运算符?

当 lhs 为假时,为啥在逻辑 AND 中评估条件(三元)运算符

有人能解释一下为啥“运算符优先级”适用于 javaScript 中的“||”、“&&”等逻辑运算符吗