72 votes

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

Quelqu'un sait-il comment compter le nombre de fois qu'une valeur apparaît dans une matrice ?

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

97voto

aioobe Points 158466

Jetez un coup d'œil à Déterminer et compter les valeurs uniques d'un tableau .

Ou, pour compter le nombre d'occurrences de 5 il suffit de faire

sum(your_matrix == 5)

73voto

Amro Points 72743

Voici une liste de tous les moyens auxquels j'ai pensé pour compter les éléments uniques :

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

Option 1 : tabulation

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 : clairsemé

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

10voto

gnovice Points 70970

Une façon d'effectuer cette opération pour toutes les valeurs de 1 à 7 en une seule fois est d'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

5voto

Babak Points 61

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

n = histc(M,w)

si vous ne connaissez pas la plage de chiffres de M :

n = histc(M,unique(M))

Il s'agit par exemple d'une commande SQL Group by !

3voto

Abhinav Points 547

Il s'agit d'un très bon fichier de fonctions disponible sur Matlab Central File Exchange.

lien countmember.m

Ce fichier de fonctions 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. De plus, elle fonctionne aussi bien pour les tableaux de cellules que pour les tableaux numériques.

SOLUTION : Vous pouvez utiliser cette fonction en conjonction avec la fonction intégrée de Matlab, "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).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X