9

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

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

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

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

对于其中的值,a如果它们比a_thresh我希望输出为 0 中的相应值小 0.5 倍 - 同样对于 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;

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

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

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

4

1 回答 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);

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

于 2013-04-18T10:16:30.513 回答