What is wrong with my while loop?

3 views (last 30 days)
I have this big matrix, 592x528x903 single, called X. I want to see if the X(:,:,1) is not equal to any other in the matrix. I use this code:
b=2;
while b < 902
if X(:,:,1) ~= X(:,:,b)
b
end
b=b+1;
end
disp done
I get nothing on the screen, except done, so first I thought they all where equal. The problem is that if i use "equal to", i get the same response, nothing on the screen.
b=2;
while b < 902
if X(:,:,1) == X(:,:,b)
b
end
b=b+1;
end
disp done
Something is not working, they can't be both equal and not equal at the same time, or am I wrong?

Accepted Answer

Brendan Hamm
Brendan Hamm on 15 Feb 2018
Your problem is that the result of
X(:,:,1) == X(:,:,b)
or
X(:,:,1) ~= X(:,:,b)
will return a logical matrix the same size as X(:,:,1) which apparently is never all true or all false and thus the if statement always evaluates to be false. The reson is this performs an element-wise comparison. If you want to check equality of the entire matrix, you should use the isequal function (isequaln if you want to ignore NaN in the matrices).
X = randi([0 1],2,2,902); % X with some equal pages.
b=2;
while b < 902
if isequal(X(:,:,1),X(:,:,b)) % or isequaln
b
end
b=b+1;
end
disp done

More Answers (1)

KL
KL on 15 Feb 2018
Edited: KL on 15 Feb 2018
Comparing matrices is easier if you use isequal command.
You should use it like,
if(isequal(X(:,:,1),X(:,:,b)))
What you're actually doing while using == or ~= is extracting a logical matrix as the result. Check this below example,
A = [1,2;3 4];
B = [1 0;3 4];
A==A
ans =
1 1
1 1
A==B
ans =
1 0
1 1
You see the problem?
Whereas, if you use isequal,
isequal(A,A)
ans =
1
isequal(A,B)
ans =
0

Products

Community Treasure Hunt

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

Start Hunting!