2013-04-18 53 views
6

我有一个简单的问题,我正在寻找一个快速的Matlab实现。我有值的数组,让我们说:||的操作数和&&操作符必须可以转换为逻辑标量值

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

然后我有一个类似大小的预定值排列,让我们说这是:

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

对于内a值,如果它们比相应的0.5倍小在a_thresh值我想要的输出为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; 

不过,我得到一个错误,指出:

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

如何解决这个有什么建议?很明显,我可以使用循环来做到这一点,这将是微不足道的,但我想保持代码向量化。

回答

14

事情有关&&是,它可以在标量只有工作,而&可以在阵列操作为好。您应该将&&更改为&以使其正常工作(您可以在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); 

我不知道,如果计算本身是正确的,所以我会留给你检查。

+0

太棒了 - 这解决了&/ &&问题 - 我有些怎么也不知道,谢谢!现在我有一个小问题,右侧的元素数量与左侧不同。有没有一种明智的方法来解决这个问题? – trican

+0

@trican我已经完成了,请参阅更新。 –

+1

许多非常感谢Eitan - 您的解决方案完美无瑕 - 显然是一般的,我可以看到我可以在我的Matlab工作中的其他地方使用它 – trican