Кто-нибудь знает, как подсчитать количество раз, когда значение появляется в матрице?
Например, если у меня есть матрица размером 1500 x 1 M
(вектор), которая хранит значения будних дней (1-7), как я могу подсчитать, сколько воскресений (1), понедельников (2),..., Суббота (7) хранятся в M
?
Посмотрите Определите и подсчитайте уникальные значения массива.
Или, чтобы подсчитать количество вхождений 5
, просто выполните
sum(your_matrix == 5)
Здесь перечислены все способы, с помощью которых можно было бы подсчитать уникальные элементы:
M = randi([1 7], [1500 1]);
t = tabulate(M);
counts1 = t(t(:,2)~=0, 2);
counts2_1 = hist( M, numel(unique(M)) );
counts2_2 = histc( M, unique(M) );
counts3 = accumarray(M, ones(size(M)), [], @sum);
%# or simply: accumarray(M, 1);
[MM idx] = unique( sort(M) );
counts4 = diff([0;idx]);
counts5 = arrayfun( @(x)sum(M==x), unique(M) );
counts6 = sum( bsxfun(@eq, M, unique(M)') )';
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)
если вы не знаете диапазон чисел в M:
n = histc(M,unique(M))
Он является таким, как SQL Group по команде!
Это было бы идеальной причиной того, что мы делаем операцию над матрицей, и ответ должен быть единственным числом
sum(sum(matrix==value))
Это очень хороший файл функций, доступный на центральном файловом сервере Matlab.
Этот файл функции полностью векторизован и, следовательно, очень быстрый. Кроме того, по сравнению с функцией, которая упоминается в ответе на aioobe, эта функция не использует функцию аккумулирования, поэтому она даже совместима со старыми версиями Matlab. Кроме того, он работает как с массивами ячеек, так и с числовыми массивами.
РЕШЕНИЕ: Вы можете использовать эту функцию в сочетании со встроенной функцией matlab, "unique".
occurance_count = countmember (unique (M), M)
occurance_count будет представлять собой числовой массив с тем же размером, что и у уникального (M), а различные значения массива occurance_count будут соответствовать счету соответствующих значений (одного и того же индекса) в уникальном (M).
Используйте nnz вместо суммы. Нет необходимости в двойном вызове, чтобы свернуть матрицы к векторам и, скорее всего, быстрее, чем сумма.
nnz(your_matrix == 5)
sum(your_matrix(:) == 5)