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
?
sum(your_matrix(:) == 5)
sum(your_matrix == [ 1, 2, 3 ])
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
Option 6: bsxfun
counts6 = sum( bsxfun(@eq, M, unique(M)') )';
Option 7: spärlich
counts7 = full(sparse(M,1,1));
quelle
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 seincounts2_1 = hist( M, unique(M) )
.hist(data,nbins)
(in diesem Fall der Bereich[min(data),max(data)]
in gleich großen unterteiltN
-bins) 2) auch die sind Zentren als angebenhist(data,xvalues)
, wobei angenommenxvalues
ist , ein Vektor mit gleichmäßig verteilten Werten 3) oder falls der Vektorxvalues
nicht gleichmäßig verteilt ist, werden die Mittelpunkte zwischen aufeinanderfolgenden Werten als Bin-Kanten verwendet.hist
ruft der Code intern diehistc
Funktion auf (überprüfen Sie den Quellcodeedit hist.m
, währendhistc
es sich um eine integrierte Funktion handelt). Daher denke ich, dass es am besten ist, dies zu vermeidenhist
und direkthistc
mit expliziten Bin-Kanten aufzurufen, wie ich oben gezeigt habe.1
. Lesen Sie die folgenden Antworten zur Behandlung weiterer Fälle im Allgemeinen: stackoverflow.com/a/4093228/97160 , stackoverflow.com/a/6933863/97160Eine 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
quelle
Angenommen, w enthält Wochennummern ([1: 7])
Wenn Sie den Zahlenbereich in M nicht kennen:
Es ist wie eine SQL-Gruppe per Befehl!
quelle
Dies wäre perfekt, da wir eine Matrixoperation durchführen und die Antwort eine einzelne Zahl sein sollte
quelle
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 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).
quelle
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
quelle