Какой самый эффективный / элегантный способ удаления элементов из матрицы в MATLAB?

Вот как я использую его в доменах ...

  • Используйте iframe из родительского домена - скажем, parent.com
  • Затем на каждом домене child.com , просто сделайте postMessage на ваш parent.com iframe
  • . Все, что вам нужно сделать, это настроить протокол интерпретации сообщений postMessage для разговора с iframe parent.com.

Надеюсь, это поможет:)

10
задан Unihedron 25 October 2014 в 05:41
поделиться

3 ответа

Попробуйте эту остроту (где 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, который Вы хотите удалить.

Править:

... и вот другая опция:

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 Fanfan):

>> % 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 делают немного отличающиеся вещи: мои опции возвращают логические индексы строк для хранения, и возвраты Fanfan линейные индексы строк для удаления. Вот почему опция 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
13
ответ дан 3 December 2019 в 16:31
поделиться

Можно также злоупотребить функцией strmatch для удовлетворения потребностям: следующий код удаляет все происшествия данной строки b в матрице A

A(strmatch(b, A),:) = [];

Если необходимо удалить больше чем одну строку, такую как все строки от матрицы B, выполните итерации по ним:

for b = B'
   A(strmatch(b, A),:) = [];
end
5
ответ дан 3 December 2019 в 16:31
поделиться

Простое решение здесь состоит в том, чтобы надеяться устанавливать функции принадлежности, т.е. setdiff, объединение и ismember.

A = [-4  0.5;
   -2    0.5;
    2    3;
    4    0.5;
   -2    0.5];

B = [-2 .5;7 7];

Посмотрите то, что ismember делает с двумя массивами. Используйте опцию 'строк'.

ismember(A,B,'rows')

ans =
     0
     1
     0
     0
     1

Так как мы хотим удалить строки, которые находятся также в B, просто сделайте это:

A(ismember(A,B,'rows'),:) = []

A = 
      -4          0.5
       2            3
       4          0.5

Остерегайтесь того набора, функции принадлежности ищут Точное совпадение. Целые числа или кратные числа 1/2 те, которые находятся в A, удовлетворяют то требование. Они точно представлены в арифметике с плавающей точкой в MATLAB.

Если бы эти числа были реальными числами с плавающей точкой, то я был бы более осторожным. Там я использовал бы допуск на различии. В этом случае я, возможно, вычислил разделять знаками препинания матрицу расстояния между двумя наборами чисел, удалив строку, только если она находилась в пределах некоторого данного расстояния одной из строк B.

7
ответ дан 3 December 2019 в 16:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: