83 views (last 30 days)

Hello, I am trying to run an if statement with multiple conditions as below,

if abs(a-a_t)>0.0001 && abs(b-b_t)>0.00001 && abs(c-c_t)>0.0001 && abs(d-d_t)>0.00001

x=0;

y=0;

end

Even when all the conditions are satisfied, the values of x and y are not updated. But, it works if we have just two conditions (I've tried different combinations of two variable values which work, but using all conditions in separate brackets doesn't work). MATLAB documentation says that multiple logical operators could be used, but it doesn't seem to be working in my case. Is there a limit to the number of logical operators that could be combined? Or, am I missing something?

Thanks for your advice.

dpb
on 8 Jul 2018

Edited: dpb
on 8 Jul 2018

Apparently the issue was likely one of the cases wasn't actually T or some similar misstep, but illustrates the difficulties inherent in writing code with sequentially-named variables. Use arrays instead.

If had defined a variable data and commensurate test value, then the following could be written much more succinctly and much easier to both code and debug--

data=[a b c ...]; % the data array (*)

test=[a_t b_t c_t ...]; % associated test values

lims=[0.0001 0.00001, 0.0001, ...]; % and criteria

if all(abs(data-test))<lims % see if all ok

....

(*) And, of course, this is not intended to suggest one should write the specific line concatenating all these variables to create the one; instead use the vector features of Matlab when creating the variables initially, either by reading one or more files or the result of other calculations, whatever.

Don't create the problem in the beginning to have to try to fix later...

Image Analyst
on 9 Jul 2018

Well x, x_temp, y, y_temp, z, and z_temp each do what they do independent of each other (i.e. x and x_temp don't depend on y and z, or a, b, c, or d). So each loop for x, y, and z is independent and the order doesn't matter as far as I can see. There is no break or continue so each must get done in turn.

Likewise, the big if statement doesn't depend on x, x_temp, y, y_temp, z, or z_temp so it's independent and will get tested no matter what.

I don't know what "most sensitive" means (maybe first to converge?) but if you're talking about short circuiting and not testing b, c, and d if abs(a-a_temp)>0.0001, then that's not true. It will test for b, c, and d because you have && in there not ||. Anyway, even if it was || and you did short circuit and not test the others, you'd only save like a half a nanosecond or something - not enough to worry about.

Opportunities for recent engineering grads.

Apply TodayFind the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!
## 2 Comments

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/409279-on-multiple-logical-test-failing-in-if-statement#comment_586909

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/409279-on-multiple-logical-test-failing-in-if-statement#comment_586909

## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/409279-on-multiple-logical-test-failing-in-if-statement#comment_586915

⋮## Direct link to this comment

https://www.mathworks.com/matlabcentral/answers/409279-on-multiple-logical-test-failing-in-if-statement#comment_586915

Sign in to comment.