Попробуйте эту однострочную (где A - ваша матрица пересечений, а B - значение, которое нужно удалить):
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),:);
Затем просто повторите последнюю строку для каждого нового B , который вы хотите удалить.
EDIT:
... и вот еще один вариант:
A = A((A(:,1) ~= B(1)) | (A(:,2) ~= B(2)),:);
ПРЕДУПРЕЖДЕНИЕ: Ответы здесь лучше всего использовать в случаях, когда небольшие ошибки с плавающей запятой не ожидаются (то есть с целочисленными значениями). Как отмечено в этом последующем вопросе , использование операторов "==" и "~ =" может привести к нежелательным результатам. В таких случаях вышеупомянутые параметры должны быть изменены, чтобы использовать реляционные операторы вместо операторов равенства. Например, второй вариант, который я добавил, будет изменен на:
tolerance = 0.001; % Or whatever limit you want to set
A = A((abs(A(:,1)-B(1)) > tolerance) | (abs(A(:,2)-B(2)) > tolerance),:);
Просто быстренько! =) * * Один тысяча двадцать-шесть
НЕКОТОРЫЕ РУДИМЕНТНЫЕ СРОКИ:
В случае, если кто-то действительно заинтересован в эффективности, я просто выполнил простую синхронизацию для трех разных способов получить субиндекс для матрицы (два варианта, которые я перечислил выше, и Фанфана опция 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.
Как видите, опция STRMATCH работает быстрее, чем мое первое предложение, но второе предложение является самым быстрым из всех трех. Однако обратите внимание, что мои параметры и функции Fanfan выполняют несколько разные вещи: мои параметры возвращают логические индексы строк в keep , а функции Fanfan возвращают линейные индексы строк в remove . Вот почему опция STRMATCH использует форму:
A(index,:) = [];
пока я использую форму:
A = A(index,:);
Однако мои индексы могут быть отменены, чтобы использовать первую форму (индексирование строк до удалить ):
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