我有一个简单的问题,我正在寻找 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 中阅读更多相关信息)。
更新:
关于评论中描述的第二个问题:左侧元素的数量不同,因为您使用的是索引(仅选择某些元素),而右侧您使用的是整个矩阵 a
和 a_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/