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

66

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

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

Теги:
matrix
count

7 ответов

92
Лучший ответ

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

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

sum(your_matrix == 5)
  • 1
    Хороший и простой ответ. А чтобы расширить код для работы с несколькими матрицами строк, просто используйте: sum (sum (your_matrix == 5))
  • 8
    @AlexB. Правильное расширение, которое работает для матриц произвольных измерений, будет sum(your_matrix(:) == 5)
Показать ещё 1 комментарий
73

Здесь перечислены все способы, с помощью которых можно было бы подсчитать уникальные элементы:

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: накопитель

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));
  • 2
    Второй вариант - это то, что я искал, спасибо!
  • 4
    Я предпочитаю этот ответ тому, который связан с математическими работами, поскольку он очень ясен и самодостаточен.
Показать ещё 5 комментариев
9

Один из способов выполнения этой операции для всех значений с 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
5

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

n = histc(M,w)

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

n = histc(M,unique(M))

Он является таким, как SQL Group по команде!

4

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

sum(sum(matrix==value))
3

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

ссылка countmember.m

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

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

occurance_count = countmember (unique (M), M)

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

2

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

nnz(your_matrix == 5)

Doc

Ещё вопросы

Сообщество Overcoder
Наверх
Меню