Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

matlab - Operands to the || and && operators must be convertible to logical scalar values

I have a simple problem that I'm looking for a fast implementation in Matlab. I have an array of values, let's say:

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

I then have a similarly sized threshold array, let's say it's:

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

For values within a if they are 0.5x smaller than the corresponding value in a_thresh I want the output to be 0 - similarly for 1.2x the value in a_thresh should also be set to zero, i.e.:

a(a < a_thresh.*0.4) = 0
a(a > a_thresh.*1.2) = 0

For values between 0.4x and 0.5x and 1.0x and 1.2x I want a proportional amount and else where between 0.5 and 1.0 I want to use the value of a unaltered. I thought I could use something like the following:

 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;

However, I get an error that says:

Operands to || and && operations must be convertible to logical scalar values

Any advice on how to solve this? Obviously I could use loops to do this and it would be trivial, but I want to keep the code vectorized.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The thing about && is that it can operate only on scalars, whereas & can operate on arrays as well. You should change the && to & to make it work (you can read more about it in this question).

Update:
Regarding your second problem described in a comment: the number of elements on the left is different because you're using indices (selecting only certain elements), and on the right you're working with the entire matrix a and a_thresh.

You need to use indices in both sides, so I suggest storing it in a variable and then use it as an array subscript, along these lines:

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);

I'm not sure if the calculation itself is correct, so I'll leave it to you to check.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...