Как подсчитать количество элементов, используя функцию НАЙТИ в MATLAB? - PullRequest
1 голос
/ 21 июня 2010

Как я могу использовать функцию FIND для подсчета количества элементов данного значения вместо использования цикла?Например, в массиве item ниже есть 3 вхождения числа 23, 2 вхождения числа 22 и 2 вхождения числа 20.

....
for i=2:n
    if item(i-1)~=item(i)
        nItem21(i)=1;
    else 
        nItem21(i)=nItem21(i-1)+1;
    end
end

item Num
23   2
23   4
23   6
22   3
22   1
20   6
20   8

Ответы [ 4 ]

4 голосов
/ 21 июня 2010

Вы можете сделать следующее: определить, где изменяется значение item, а затем использовать diff для получения значений.

item = [
23   
23   
23   
22   
22   
20   
20];

% find the 'last' entries of each consecutive group of numbers
chgRowNum = [find(item(1:end-1) ~= item(2:end);length(item)]; 

counts = diff([0;chgRowNum]);

correspondingItems = item(chgRowNum);
2 голосов
/ 21 июня 2010

Другой вариант для этой ситуации - использовать функцию ACCUMARRAY , которая не требует, чтобы список сортировался первым.Это особенно полезно, если в item должен быть набор чисел, охватывающий диапазон 1:N, где N - любое целочисленное значение.Вот как это будет работать для вашего примера:

item = [23; 23; 23; 22; 22; 20; 20];  %# A column vector of integers
counts = accumarray(item,1);          %# Collect counts of each item into
                                      %#   a 23-by-1 array

Массив counts - это массив 23 на 1, где элементы, индексированные по 23, 22 и 20, содержат числа 3, 2 и2 соответственно.Все остальные элементы равны 0 (т.е. не найдено ни одного счетчика для чисел от 1 до 19 или 21).

Если вы хотите получить список уникальных значений в item и соответствующих им значений, выможно сделать это с помощью функции UNIQUE :

>> uniqueValues = unique(item)  %# Get the unique values in item

uniqueValues =

    20
    22
    23

>> counts = counts(uniqueValues)  %# Get just the counts for each unique value

counts =

     2
     2
     3
2 голосов
/ 21 июня 2010

Просто для полноты я бы использовал функцию histc.

item = [
23   
23   
23   
22   
22   
20   
20];
%get the unique items
[uni_items, minds, uinds] = unique(item);
%count them
counts = histc(uinds, 1:numel(uni_items));
%put them in the original order
ocounts = counts(minds);

Это заботится о том, что они не в порядке или не являются целыми числами.

2 голосов
/ 21 июня 2010

Find возвращает индексы ненулевых элементов в массиве.Если вы хотите подсчитать все вхождения ваших элементов (при условии, что они являются целыми числами), вы можете использовать функцию hist.Назначая вывод, он не будет строить гистограмму.Вместо этого он вернет массив вхождений.

x=[20 23 20 22 23 21 23 22];
bins=min(x):max(x);
count=hist(x,bins);
list=unique(x);

Теперь count содержит количество вхождений, а list содержит каждый уникальный элемент массива.Чтобы избавиться от элементов с нулевым счетом:

idx=find(count);
count=count(idx);

или опция в одну строку (без использования find):

count=count(count~=0);
...