我有一个简单的问题,我正在寻找Matlab中的快速实现。我有一系列的值,让我们说:
a = floor(rand(5,5).*255)
然后我有一个类似大小的阈值数组,让我们说它是:
a_thresh = floor(rand(5,5).*255)
对于a
内的值,如果它们比a_thresh
中的相应值小0.5倍,我希望输出为0 - 同样对于1.2x,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;
但是,我收到一条错误消息:
操作数到||和&amp;&amp;操作必须可转换为逻辑标量值
有关如何解决此问题的任何建议?显然我可以使用循环来做到这一点,这将是微不足道的,但我想保持代码矢量化。
答案 0 :(得分:14)
关于&&
的问题是它只能在标量上运行,而&
也可以在数组上运行。您应该将&&
更改为&
以使其有效(您可以在this question中详细了解它。)
<强>更新强>
关于评论中描述的第二个问题:左侧的元素数量不同,因为您使用的是索引(仅选择某些元素),右侧则使用整个矩阵a
和{ {1}}。
你需要在两边都使用索引,所以我建议将它存储在一个变量中,然后将它作为数组下标用于这些行:
a_thresh
我不确定计算本身是否正确,所以我会留给你检查。