# How to break with two conditions

6 views (last 30 days)
Moe on 26 Nov 2014
Commented: Adam on 1 Dec 2014
I want to break my code
when both m and m2m is smaller than 0
I used the following command, but it gave me error:
if m(:,:,j) < 0 AND m2m(:,:,j) < 0
break % get out of the for-loop
end
% Undefined function 'AND' for input arguments of type 'char'.
% Error in new55 (line 340)
if m(:,:,j) < 0 AND
m2m(:,:,j) < 0
##### 3 CommentsShow 1 older commentHide 1 older comment
Stephen23 on 1 Dec 2014
+1 Star Strider for listing more than just and and all.
Star Strider on 1 Dec 2014
Thank you!

Image Analyst on 26 Nov 2014
m(:,:,j) and m2(:,:,j) are not single numbers. They're 2D arrays. I suggest you wrap them in any() or all(), depending on what you're wanting - any element to meet the criteria or all of the elements in the 2D matrix to meet the criteria. Plus use && instead of AND:
if all(m(:,:,j)) < 0 && all(m2m(:,:,j)) < 0
Image Analyst on 29 Nov 2014
Edited: Image Analyst on 29 Nov 2014
Mohammad, my code works. The problem is you did not try it. You modified it and broke it. You summed m . I did not do that. I did not sum m. I summed a logical array , gotten by comparing m to 0, and that array has only 0's and 1's in it. Look at this example with your simplified m:
m = [1;-20;-3;4;5];
mSlice = m < 0 % Logical array
In the command window:
mSlice =
0
1
1
0
0
See, mSlice has only 0 and 1 so that when you sum it, there is no way possible that you can get a negative number . Try it again, like I said this time comparing it to 0.
By the way, Adam's way doesn't work either for the same reason mine didn't - all() operating on a 3D array gives a row vector, not a true or false answer. It seems like it should (and that's why I originally proposed it, but when I actually tested it, it didn't.
Yeah, I guess a squeeze may be needed and maybe an all( all( ... ) ).
I created functions called
column(x)
row(x)
in our Matlab library that just warp up the functionality for making a matrix a column ( i.e. the (:) notation ) and a row (transpose of column notation) so that I can use them in situations like this because Matlab does not allow syntax like:
m(:,:,j)(:)
which is what you'd need to do to achieve the same thing in non-function syntax.

Andrew Reibold on 26 Nov 2014
if m(:,:,j) < 0 && m2m(:,:,j) < 0
'AND' will not work. Make that change and start debugging from there.
Stephen23 on 1 Dec 2014
As Image Analyst points out " m(:,:,j) and m2(:,:,j) are not single numbers. They're 2D arrays", so the scalar operator && will not work like that. These arrays need to be wrapped in an all or any (or something similar) before applying the && operator:
if all(m(:,:,j) < 0 ) && all(m2m(:,:,j) < 0 )