Есть ли более элегантная замена для этого цикла MATLAB? - PullRequest
4 голосов
/ 06 августа 2010

Я хочу стать лучше в векторизации своих циклов в MATLAB. В данный момент я пытаюсь подсчитать вхождения значений в список целых. Мой код похож на это:

list = [1 2 2 3 1 3 2 2 2 1 5];
occurrence_list = zeros(1,max(list));

for x=list
    occurrence_list(x) = occurrence_list(x) + 1;
end

Есть ли простая векторизованная замена для цикла for? (Или мне не хватает встроенной функции MATLAB?) Я делаю это на довольно небольших наборах данных, поэтому время не проблема. Я просто хочу улучшить свой стиль кодирования MATLAB.

Ответы [ 3 ]

5 голосов
/ 07 августа 2010

В дополнение к функциям HIST / HISTC вы можете использовать ACCUMARRAY для подсчета вхождений (а также ряда других операций агрегирования)

counts = accumarray(list(:), 1)
%# same as: accumarray(list(:), ones(size(list(:))), [], @sum)

Другой способ - использовать TABULATE из панели инструментов статистики.(возвращает значение, число, частоту):

t = tabulate(list)
t =
            1            3       27.273
            2            5       45.455
            3            2       18.182
            4            0            0
            5            1       9.0909

Обратите внимание, что в случаях, когда значения не начинаются с 1 м, или если есть большие промежутки между минимальным и максимальным, вы получитемного нулей между счетами.Вместо этого используйте:

list = [3 11 12 12 13 11 13 12 12 12 11 15];
v = unique(list);
table = [v ; histc(list,v)]'

table =
     3     1
    11     3
    12     5
    13     2
    15     1

, представляющий уникальные значения и их количество (это будет перечислять только значения с как минимум одним вхождением)

4 голосов
/ 06 августа 2010

Для этого вы можете использовать функцию hist .Укажите выходные данные и задайте для целых бинов целые числа в диапазоне массива.

0 голосов
/ 07 августа 2010

Итак, это в основном гистограмма. С моей памяти - поищите функцию HIST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...