What is wrong with my while loop?
2 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Jet Verheij
le 15 Fév 2018
Commenté : Jet Verheij
le 15 Fév 2018
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?
0 commentaires
Réponse acceptée
Brendan Hamm
le 15 Fév 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
Plus de réponses (1)
KL
le 15 Fév 2018
Modifié(e) : KL
le 15 Fév 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
Voir également
Catégories
En savoir plus sur Logical dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!