如何在 C++ 中使用犰狳在多维数组之间进行按位与?

Posted

技术标签:

【中文标题】如何在 C++ 中使用犰狳在多维数组之间进行按位与?【英文标题】:How to do bit-wise AND between multi-dimensional arrays using armadillo in C++? 【发布时间】:2020-08-26 11:12:03 【问题描述】:

我的任务是使用带有 C++ 的犰狳在 matlab 中重写代码 is_valid = (DoG == DoG_max) & (DoG >= threshold);DoGDoG_max 是具有相同大小的多维数组907 x 1210 x 5threshold is a scalar

根据犰狳的documentation,位相等运算符==是内置的,位大于 操作可以替换为the member function.clean(),即将所有元素设置为零,但高于阈值的元素除外。

这是我的代码:

// arma::cube DoG, DoG_max;  // Size: 907 x 1210 x 5.
arma::ucube is_valid(arma::size(DoG), arma::fill::zeros);
DoG.clean(threshold);
for (int s = 0; s < is_valid.n_slices; ++s) 
  is_valid.slice(s) = (DoG.slice(s) == DoG_max.slice(s));

令我困惑的是 按位 AND 运算符,它不是犰狳提供的。我想知道我的代码逻辑是否和is_valid = (DoG == DoG_max) &amp; (DoG &gt;= threshold);一致?根据我的调查,结果与matlab中的不同。

如果有使用 Eigen 的解决方案,也请告诉我!

【问题讨论】:

【参考方案1】:

&amp;&amp; 运算符是在 Armadillo 中实现的,但奇怪的是它没有记录在案。试试这个作为你的 Matlab 代码的翻译:

ucube is_valid = (DoG == DoG_max) && (DoG >= threshold);

如果你想要一个标量输出,试试这个:

bool is_valid = all(vectorise((DoG == DoG_max) && (DoG >= threshold)));

C++ 和 Matlab 之间的“&”和“&&”的含义有些混淆。在 C++ 中,“&”表示“按位与”,而“&&”表示“逻辑与”。 https://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B

在 Matlab 中,“&”和“&&”都表示“逻辑与”,但根据上下文的不同,计算结果略有不同:What's the difference between & and && in MATLAB?

【讨论】:

以上是关于如何在 C++ 中使用犰狳在多维数组之间进行按位与?的主要内容,如果未能解决你的问题,请参考以下文章

自定义按位与本机 CPU 操作的性能

c++怎样申请一个已知字节的空间,然后按位操作把字节的每位都存储满,然后再存入一个二进制文件中

不清楚按位与赋值的使用

按位与按位或按位异或等等(& | ^ ~ >> <<)

按位与&按位或|按位异或^

如何在 C++ 中正确使用动态分配的多维数组 [重复]