Essayez ce one-liner (où A est votre matrice d'intersection et B est la valeur à supprimer):
A = [-4.0 0.5;
-2.0 0.5;
2.0 3.0;
4.0 0.5;
-2.0 0.5];
B = [-2.0 0.5];
A = A(~all(A == repmat(B,size(A,1),1),2),:);
Ensuite, il suffit de répéter la dernière ligne pour chaque nouvelle B vous voulez retirer.
EDIT:
... et voici une autre option:
A = A((A(:,1) ~= B(1)) | (A(:,2) ~= B(2)),:);
AVERTISSEMENT: Les réponses ici sont mieux utilisées pour les cas où des erreurs ponctuelles petites Floating ne sont pas attendus (c.-à valeurs entières). Comme indiqué dans ce follow-up question, l'utilisation des opérateurs "==" et "~ =" peut entraîner des résultats indésirables. Dans ce cas, les options ci-dessus doivent être modifiées pour utiliser des opérateurs relationnels au lieu des opérateurs d'égalité. Par exemple, la deuxième option que j'ai ajoutée serait modifiée en:
tolerance = 0.001; % Or whatever limit you want to set
A = A((abs(A(:,1)-B(1)) > tolerance) | (abs(A(:,2)-B(2)) > tolerance),:);
Juste une petite tête! =)
QUELQUES TEMPS RUDIMENTAIRE:
En cas où quelqu'un était vraiment intéressé par l'efficacité, je viens de faire un certain temps simple pour trois façons différentes pour obtenir le sous-indice pour la matrice (les deux les options répertoriées ci-dessus et Fanfan's option strmatch):
>> % Timing for option #1 indexing:
>> tic; for i=1:10000, index = ~all(A == repmat(B,size(A,1),1),2); end; toc;
Elapsed time is 0.262648 seconds.
>> % Timing for option #2 indexing:
>> tic; for i=1:10000, index = (A(:,1) ~= B(1)) | (A(:,2) ~= B(2)); end; toc;
Elapsed time is 0.100858 seconds.
>> % Timing for STRMATCH indexing:
>> tic; for i=1:10000, index = strmatch(B,A); end; toc;
Elapsed time is 0.192306 seconds.
Comme vous pouvez le voir, l'option strmatch est plus rapide que ma première suggestion, mais ma deuxième suggestion est la plus rapide des trois. Notez cependant que mes options et Fanfan font des choses légèrement différentes: mes options retournent les indices logiques des lignes à garder, et Fanfan retourne les index linéaires des rangées à en supprimant.Voilà pourquoi l'option strmatch utilise la forme:
A(index,:) = [];
alors que le mien utiliser la forme:
A = A(index,:);
Cependant, mes indices peuvent être réduits à néant pour utiliser la première forme (rangées d'indexation pour supprimer):
A(all(A == repmat(B,size(A,1),1),2),:) = []; % For option #1
A((A(:,1) == B(1)) & (A(:,2) == B(2)),:) = []; % For option #2
J'ai presque eu une solution de vecteur mais pas un peu plus bavard que le vôtre. Nice one-liner. – Azim
WoW ... façon si élégante .... –