web-dev-qa-db-fra.com

Comment compter le nombre d'éléments d'une valeur donnée dans une matrice?

Est-ce que quelqu'un sait comment compter le nombre de fois qu'une valeur apparaît dans une matrice?

Par exemple, si j’ai une matrice de 1500 x 1 M (vecteur) qui stocke les valeurs des jours de la semaine (1 à 7), comment pourrais-je compter le nombre de dimanches (1), de lundis (2), .. ., Les samedis (7) sont stockés dans M?

70
Niko Gamulin

Regardez Déterminez et comptez les valeurs uniques d'un tablea .

Ou, compter le nombre d'occurrences de 5, faites simplement

sum(your_matrix == 5)
97
aioobe

Voici une liste de toutes les solutions possibles pour compter des éléments uniques:

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

Option 1: tabuler

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

Option 2: hist/histc

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

Option 3: accumarray

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

Option 4: tri/diff

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

Option 5: arrayfun

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

Option 6: bsxfun

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

Option 7: rare

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

Une façon de réaliser cette opération pour toutes les valeurs 1 à 7 à la fois consiste à utiliser la fonction 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
10
gnovice

supposons que w contient les numéros de semaine ([1: 7])

n = histc(M,w)

si vous ne connaissez pas la plage de nombres en M:

n = histc(M,unique(M))

C'est comme un groupe SQL par commande!

5
Babak

ce serait parfait parce que nous faisons l'opération sur la matrice, et la réponse devrait être un nombre unique

sum(sum(matrix==value))
4
radhe_shyam

C'est un très bon fichier de fonction disponible sur Matlab Central File Exchange.

countmember.m link

Ce fichier de fonction est totalement vectorisé et donc très rapide. De plus, par rapport à la fonction mentionnée dans la réponse de aioobe, cette fonction n’utilise pas la fonction accumarray, ce qui explique pourquoi elle est même compatible avec les anciennes versions de Matlab. En outre, cela fonctionne pour les tableaux de cellules ainsi que les tableaux numériques.

SOLUTION: Vous pouvez utiliser cette fonction conjointement avec la fonction matlab intégrée, "unique".

occurance_count = countmember (unique (M), M)

occurance_count sera un tableau numérique de même taille que celui de unique (M) et les différentes valeurs du tableau occurance_count correspondront au nombre de valeurs correspondantes (même index) dans unique (M).

3
Abhinav

Utilisez nnz au lieu de sum. Il n'est pas nécessaire que le double appel réduit les matrices en vecteurs et il est probablement plus rapide que sum.

nnz(your_matrix == 5)

Doc

2
Andy Campbell