|| 和 && 运算符的操作数必须可转换为逻辑标量值 [关于IT技术中的运算符]

9

我有一个简单的问题,需要用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;

然而,我遇到了一个错误,提示如下:
"||" 和 "&&" 操作的运算数必须可转换为逻辑标量值。
有没有什么建议来解决这个问题?显然,我可以使用循环来解决这个问题,但是我想保持代码向量化。
1个回答

18
&&只能用于标量,而&也可用于数组。你应该将&&更改为&以使其正常工作(您可以在此问题中了解更多信息)。
更新: 关于你在评论中描述的第二个问题:左侧元素的数量不同,因为你使用了索引(仅选择某些元素),而右侧你正在处理整个矩阵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);

我不确定计算本身是否正确,所以我将让您检查。


太棒了 - 这解决了 &/&& 的问题 - 我不知道这个,谢谢!现在我有一个小问题,右边的元素数量与左边不同。有没有聪明的方法来解决这个问题? - trican
1
非常感谢Eitan - 你的解决方案完美地运行了 - 而且显然足够通用,我可以看到如何在我的Matlab工作中其他地方使用它。 - trican

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接