Wie kann ich die Anzahl der Elemente eines bestimmten Werts in einer Matrix zählen?

73

Weiß jemand, wie man zählt, wie oft ein Wert in einer Matrix erscheint?

Wenn ich beispielsweise eine 1500 x 1-Matrix M(Vektor) habe, in der die Werte von Wochentagen (1 - 7) gespeichert sind, wie kann ich dann zählen, wie viele Sonntage (1), Montage (2), ..., Samstage (7) sind gespeichert in M?

Niko Gamulin
quelle

Antworten:

98

Schauen Sie sich Bestimmen und Zählen eindeutiger Werte eines Arrays an .

Oder, um die Anzahl der Vorkommen von zu zählen 5, tun Sie es einfach

sum(your_matrix == 5)
aioobe
quelle
1
Gute und einfache Antwort. Und um den Code so zu erweitern, dass er mit mehr als einer einzelnen Zeilenmatrix funktioniert, verwenden Sie einfach: sum (sum (your_matrix == 5))
Alex B.
8
@AlexB. Die richtige Erweiterung, die für Matrizen beliebiger Dimensionen funktioniert, wäresum(your_matrix(:) == 5)
Dennis Jaheruddin
auch für das Zählen von Vorkommen mehrerer Werte, tunsum(your_matrix == [ 1, 2, 3 ])
Martin Jakubik
73

Hier ist eine Liste aller Möglichkeiten, wie ich mir vorstellen kann, einzigartige Elemente zu zählen:

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

Option 1: tabellieren

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: sort / 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: spärlich

counts7 = full(sparse(M,1,1));
Amro
quelle
4
Ich ziehe diese Antwort der Antwort vor, die mit Mathworks verknüpft ist, da sie sehr klar und in sich geschlossen ist.
Gakera
@ Amro Mit M = [1 2 100000], Option 2, counts2_1 = hist( M, numel(unique(M)) )gibt [2 0 1]was nicht gut genug ist, ja? Es sollte gerecht sein counts2_1 = hist( M, unique(M) ).
Evgeni Sergeev
@ EvgeniSergeev: Du hast recht. Das zweite Argument von HIST unterschiedlichen Bedeutungen haben kann : 1) es ein Skalar sein kann , die Anzahl von Bins angibt hist(data,nbins)(in diesem Fall der Bereich [min(data),max(data)]in gleich großen unterteilt N-bins) 2) auch die sind Zentren als angeben hist(data,xvalues), wobei angenommen xvaluesist , ein Vektor mit gleichmäßig verteilten Werten 3) oder falls der Vektor xvaluesnicht gleichmäßig verteilt ist, werden die Mittelpunkte zwischen aufeinanderfolgenden Werten als Bin-Kanten verwendet.
Amro
@EvgeniSergeev: In allen drei Fällen histruft der Code intern die histcFunktion auf (überprüfen Sie den Quellcode edit hist.m, während histces sich um eine integrierte Funktion handelt). Daher denke ich, dass es am besten ist, dies zu vermeiden histund direkt histcmit expliziten Bin-Kanten aufzurufen, wie ich oben gezeigt habe.
Amro
1
Die Beispiele, die ich oben gegeben habe, waren hauptsächlich für die von OP gezeigten Daten gedacht, und einige der Methoden gehen davon aus, dass Datenwerte ganze Zahlen sind und vorzugsweise bei beginnen 1. Lesen Sie die folgenden Antworten zur Behandlung weiterer Fälle im Allgemeinen: stackoverflow.com/a/4093228/97160 , stackoverflow.com/a/6933863/97160
Amro
10

Eine Möglichkeit, diesen Vorgang für alle Werte 1 bis 7 gleichzeitig auszuführen, ist die Verwendung der Funktion 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
gnovice
quelle
5

Angenommen, w enthält Wochennummern ([1: 7])

n = histc(M,w)

Wenn Sie den Zahlenbereich in M ​​nicht kennen:

n = histc(M,unique(M))

Es ist wie eine SQL-Gruppe per Befehl!

Babak
quelle
4

Dies wäre perfekt, da wir eine Matrixoperation durchführen und die Antwort eine einzelne Zahl sein sollte

sum(sum(matrix==value))
radhe_shyam
quelle
3

Dies ist eine sehr gute Funktionsdatei, die in Matlab Central File Exchange verfügbar ist.

countmember.m link

Diese Funktionsdatei ist vollständig vektorisiert und daher sehr schnell. Außerdem verwendet diese Funktion im Vergleich zu der Funktion, auf die in der Antwort von aioobe verwiesen wird, nicht die Accumarray-Funktion, weshalb dies sogar mit älteren Versionen von Matlab kompatibel ist. Es funktioniert auch für Zellenarrays sowie für numerische Arrays.

LÖSUNG: Sie können diese Funktion in Verbindung mit der integrierten Matlab-Funktion "unique" verwenden.

occurance_count = countmember (eindeutig (M), M)

occurance_count ist ein numerisches Array mit der gleichen Größe wie das von unique (M), und die unterschiedlichen Werte des occurance_count-Arrays entsprechen der Anzahl der entsprechenden Werte (gleicher Index) in unique (M).

Abhinav
quelle
2

Verwenden Sie nnz anstelle von sum. Der Doppelaufruf muss keine Matrizen zu Vektoren zusammenfassen, und er ist wahrscheinlich schneller als die Summe.

nnz(your_matrix == 5)

Doc

Andy Campbell
quelle