matlab - удаление элементов с низкой частотой в массиве - PullRequest
0 голосов
/ 08 июня 2011

Если у вас есть массив MATLAB, такой как ниже:

A = [1,1,1,1,2,2,2,2,3,3,3,4,4,5]

Я хочу иметь возможность фильтровать этот массив так, чтобы элементы, которые имеют низкую частоту, были удалены.

Другими словами, есть ли простой способ удалить элементы в массиве, которые имеют определенную низкую частоту, например <= чем 2? </p>

В этом случае:

Результат будет:

[1,1,1,1,2,2,2,2,3,3,3]

Приветствия

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Вот быстрый способ. A сортировать не нужно, числа могут быть любыми.

A = [1,1,1,1,2,2,2,2,3,3,3,4,4,5];

%# count the numbers in A (use unique so that the array
%# remains at a decent size even if the values are very different)
[uniqueEntries,~,idx] = unique(A);
counts = histc(idx,1:max(idx));

%# remove all the numbers whose count is less or equal than two
A(ismember(A,uniqueEntries(counts<=2))) = []
3 голосов
/ 08 июня 2011

Я бы, наверное, сделал это как-то так (надеюсь, синтаксис хороший :))

function array= ClearElementsWithLowOccurence(array,minimalFrequency)
elements = unique(array);
indecesToRemove = [];
for i = 0:length(elements)
   indeces = find(array==elements(i));
   if (length(indeces) < minimalFrequency)
      indecesToRemove = [indecesToRemove indeces];
   end;
end;
array(indecesToRemove) = [];
0 голосов
/ 08 июня 2011

Учитывая, что опубликованная вами проблема не относится к одному домену, но встречается практически везде, я остановлюсь на псевдокоде. Я надеюсь, что это не слишком большая проблема / раздражение.

вот что вы можете сделать

  1. Взять переменные

    • LIMIT: минимальная частота, необходимая для выживания элемента (В данном случае 2)
    • ELEMENT: значение текущего элемента массива
  2. Теперь для каждого (нового) элемента, с которым вы столкнулись, выполните следующее:

    • проверить элемент LIMIT перед ELEMENT
    • если оно равно ELEMENT, это значение будет сохранено и будет продолжаться таким же образом следующее значение (теперь ELEMENT), пока массив не будет полностью пройден.
    • Если нет, удалите все вхождения этого значения. И снова продолжите .....

    Наконец, вы получите необходимый массив.

...