【问题标题】:Operands to the || and && operators must be convertible to logical scalar values|| 的操作数和 && 运算符必须可转换为逻辑标量值
【发布时间】:2013-04-11 09:38:57
【问题描述】:

我有一个简单的问题,我正在寻找在 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;

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

|| 的操作数和 && 操作必须可转换为逻辑标量值

关于如何解决这个问题的任何建议?显然我可以使用循环来做到这一点,这将是微不足道的,但我想保持代码矢量化。

【问题讨论】:

    标签: matlab logical-operators


    【解决方案1】:

    &amp;&amp; 的问题在于它只能对 标量 进行操作,而 &amp; 也可以对数组进行操作。您应该将&amp;&amp; 更改为&amp; 以使其正常工作(您可以在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);
    

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

    【讨论】:

    • 太棒了 - 解决了 &/&& 问题 - 我有些不知道,谢谢!现在我有一个小问题,右边的元素数量与左边的不同。有没有聪明的方法来解决这个问题?
    • 非常感谢 Eitan - 您的解决方案完美运行 - 并且显然足够通用,我可以看到如何在我的 Matlab 工作的其他地方使用它
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 1970-01-01
    • 2014-08-18
    • 2021-12-23
    • 2014-04-04
    相关资源
    最近更新 更多