Как я могу подсчитать количество элементов заданного значения в матрице?
кто-нибудь знает, как посчитать сколько раз значение в матрице?
например, если у меня есть матрица 1500 x 1 M (вектор), который хранит значения будней (1 - 7), Как я могу подсчитать, сколько воскресений (1), понедельников(2),... , Субботам(7) хранятся в M?
7 ответов:
посмотреть определить и подсчитать уникальные значения в массиве.
или, чтобы подсчитать количество вхождений
5, простоsum(your_matrix == 5)
вот список всех способов, которые я мог бы придумать для подсчета уникальных элементов:
M = randi([1 7], [1500 1]);Вариант 1: табулировать
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: sort / 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.
этот файл функции полностью векторизован и, следовательно, очень быстро. Кроме того, по сравнению с функцией, упоминаемой в ответе aioobe, эта функция не использует функцию accumarray, поэтому она даже совместима с более старыми версиями Matlab. Кроме того, он работает для массивов ячеек, а также числовых массивов.
решение : Вы можете использовать эту функцию в сочетании со встроенной функцией matlab "unique".
occurance_count = countmember (unique (M), M)
occurance_count будет числовым массивом с тем же размером, что и unique(M), и различные значения массива occurance_count будут соответствовать количеству соответствующих значений (тот же индекс) в unique(M).
использовать nnz вместо sum. Нет необходимости в двойном вызове для свертывания матриц в векторы, и это, вероятно, быстрее, чем сумма.
nnz(your_matrix == 5)
Comments