How to break with two conditions

조회 수: 8 (최근 30일)
Moe
Moe 2014년 11월 26일
댓글: Adam 2014년 12월 1일
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
Stephen23
Stephen23 2014년 12월 1일
+1 Star Strider for listing more than just and and all.
Star Strider
Star Strider 2014년 12월 1일
Thank you!

댓글을 달려면 로그인하십시오.

답변 (2개)

Image Analyst
Image Analyst 2014년 11월 26일
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
  댓글 수: 6
Image Analyst
Image Analyst 2014년 11월 29일
편집: Image Analyst 2014년 11월 29일
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.
Adam
Adam 2014년 12월 1일
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
Andrew Reibold 2014년 11월 26일
Instead of AND, use &&
if m(:,:,j) < 0 && m2m(:,:,j) < 0
'AND' will not work. Make that change and start debugging from there.
  댓글 수: 1
Stephen23
Stephen23 2014년 12월 1일
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 )

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Multidimensional Arrays에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by