matlab - || 的操作数and && 运算符必须可转换为逻辑标量值

标签 matlab logical-operators

我有一个简单的问题,我正在寻找 Matlab 中的快速实现。我有一组值,比方说:

 a = floor(rand(5,5).*255)

然后我有一个类似大小的阈值数组,假设它是:

a_thresh = floor(rand(5,5).*255)

对于 a 中的值,如果它们比 a_thresh 中的相应值小 0.5 倍,我希望输出为 0 - 同样地,对于 中的值的 1.2 倍>a_thresh 也应设置为零,:

a(a < a_thresh.*0.4) = 0
a(a > a_thresh.*1.2) = 0

对于 0.4x 和 0.5x 以及 1.0x 和 1.2x 之间的值,我想要一个比例数量,否则在 0.5 和 1.0 之间我想使用 a 的值不变。我想我可以使用类似下面的东西:

 a(a>= a_thresh .* 0.4 && a <a_thresh.* 0.5) = ((a - a_thresh.*0.4)/(a_thresh.*0.5 a_thresh.*0.4)) .* a;

但是,我收到一条错误消息:

Operands to || and && operations must be convertible to logical scalar values

关于如何解决这个问题有什么建议吗?显然,我可以使用循环来执行此操作,这很简单,但我想保持代码矢量化。

最佳答案

&& 的特点是它只能对标量 进行操作,而& 也可以对数组进行操作。您应该将 && 更改为 & 以使其工作(您可以在 this question 中阅读更多相关信息)。

更新:
关于评论中描述的第二个问题:左侧元素的数量不同,因为您使用的是索引(仅选择某些元素),而右侧您使用的是整个矩阵 aa_thresh

你需要在两边都使用索引,所以我建议将它存储在一个变量中,然后将它用作数组下标,沿着这些行:

idx = (a >= a_thresh*0.4 & a < a_thresh*0.5);
a(idx) = ((a(idx)-a_thresh(idx)*0.4) ./ (a_thresh(idx)*0.5*a_thresh(idx)*0.4)) .* a(idx);

我不确定计算本身是否正确,所以我会留给您检查。

关于matlab - || 的操作数and && 运算符必须可转换为逻辑标量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16080143/

相关文章:

r "any of"操作的逻辑条件

c - C 中的 ~~x 和 !!x 有什么区别?

mysql - SQL 中的 And Or 条件,但未正确嵌套它们

bit-manipulation - COBOL 中的按位逻辑运算符?

r - 在 R 中,(F & NA) 是 F 但 (T & NA) 是 NA——为什么?

matlab - 从 MATLAB 的 TreeMap 中添加节点编号/获取节点位置

algorithm - 需要帮助理解这个 MATLAB 函数实现

matlab - 即使在 Simulink 中使用过去的 SimState 时也可以设置自定义随机数生成器种子

matlab - 在第二级结构中赋值

带有矢量箱的 Matlab histc