tri*_*can 6 matlab logical-operators
我有一个简单的问题,我正在寻找Matlab中的快速实现.我有一系列的值,让我们说:
a = floor(rand(5,5).*255)
Run Code Online (Sandbox Code Playgroud)
然后我有一个类似大小的阈值数组,让我们说它是:
a_thresh = floor(rand(5,5).*255)
Run Code Online (Sandbox Code Playgroud)
对于其中的值,a如果它们比a_thresh我希望输出为0 的相应值小0.5倍- 同样对于1.2x,值a_thresh也应该设置为零,即:
a(a < a_thresh.*0.4) = 0
a(a > a_thresh.*1.2) = 0
Run Code Online (Sandbox Code Playgroud)
对于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;
Run Code Online (Sandbox Code Playgroud)
但是,我收到的错误是:
操作数为|| 和&&操作必须可转换为逻辑标量值
关于如何解决这个问题的任何建议?显然我可以使用循环来做到这一点,这将是微不足道的,但我想保持代码矢量化.
Eit*_*n T 14
问题&&在于它只能在标量&上运行,而在阵列上也可以运行.你应该改变&&,以&使其工作(你可以阅读更多关于它的这个问题).
更新:
关于评论中描述的第二个问题:左边的元素数量不同,因为你使用的是索引(只选择某些元素),右边是你正在使用整个矩阵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);
Run Code Online (Sandbox Code Playgroud)
我不确定计算本身是否正确,所以我会留给你检查.