Как я могу подсчитать количество элементов заданного значения в матрице?
кто-нибудь знает, как посчитать сколько раз значение в матрице?
например, если у меня есть матрица 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.
этот файл функции полностью векторизован и, следовательно, очень быстро. Кроме того, по сравнению с функцией, упоминаемой в ответе 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)