Как я могу подсчитать количество элементов заданного значения в матрице?

кто-нибудь знает, как посчитать сколько раз значение в матрице?

например, если у меня есть матрица 1500 x 1 M (вектор), который хранит значения дней недели (1-7), Как я могу подсчитать, сколько воскресений (1), понедельников(2),... , Субботам(7) хранятся в M?

7 ответов


посмотреть определить и подсчитать уникальные значения в массиве.

или, чтобы подсчитать количество вхождений 5, просто

sum(your_matrix == 5)

вот список всех способов, которые я мог бы придумать для подсчета уникальных элементов:

M = randi([1 7], [1500 1]);

Вариант 1: tabulate

t = tabulate(M);
counts1 = t(t(:,2)~=0, 2);

Вариант 2: hist/histc

counts2_1 = hist( M, numel(unique(M)) );
counts2_2 = histc( M, unique(M) );

Вариант 3: accumarray

counts3 = accumarray(M, ones(size(M)), [], @sum);
%# or simply: accumarray(M, 1);

Вариант 4: сортировать / diff

[MM idx] = unique( sort(M) );
counts4 = diff([0;idx]);

Вариант 5: arrayfun

counts5 = arrayfun( @(x)sum(M==x), unique(M) );

Вариант 6: bsxfun

counts6 = sum( bsxfun(@eq, M, unique(M)') )';

Вариант 7: разреженный

counts7 = full(sparse(M,1,1));

один из способов выполнить эту операцию для всех значений от 1 до 7 одновременно использовать функцию ACCUMARRAY:

>> M = randi(7,1500,1);  %# Some random sample data with the values 1 through 7
>> dayCounts = accumarray(M,1)  %# Will return a 7-by-1 vector

dayCounts =

   218       %# Number of Sundays
   200       %# Number of Mondays
   213       %# Number of Tuesdays
   220       %# Number of Wednesdays
   234       %# Number of Thursdays
   219       %# Number of Fridays
   196       %# Number of Saturdays

предположим, что w содержит номера недель ([1: 7])

n = histc(M,w)

Если вы не знаете диапазон чисел в М:

n = histc(M,unique(M))

это, например, группа SQL по команде!


Это было бы идеально, потому что мы делаем операцию над Матрицей, и ответ должен быть одним числом

sum(sum(matrix==value))

Это очень хороший файл функции, доступный в Matlab Central File Exchange.

countmember.м ссылка

этот файл функции полностью векторизован и, следовательно, очень быстро. Кроме того, по сравнению с функцией, упоминаемой в ответе aioobe, эта функция не использует функцию accumarray, поэтому она даже совместима со старыми версиями Matlab. Кроме того, он работает для массивов ячеек, а также числовых массивов.

решение : Вы можете использовать эту функцию в сочетании со встроенной функцией matlab "unique".

occurance_count = countmember (unique (M),M)

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


используйте nnz вместо sum. Нет необходимости в двойном вызове свернуть матрицы на векторы, и это, вероятно, быстрее, чем sum.

nnz(your_matrix == 5)

Doc