matlab - programar - ¿Cómo puedo contar la cantidad de elementos de un valor dado en una matriz?
programar matrices en matlab (7)
¿Alguien sabe cómo contar la cantidad de veces que aparece un valor en una matriz?
Por ejemplo, si tengo una matriz M
1500 x 1 (vector) que almacena los valores de los días de la semana (1 - 7), ¿cómo podría contar cuántos domingos (1), los lunes (2), ..., los sábados (7 ) se almacenan en M
?
Aquí hay una lista de todas las formas en que podría pensar para contar elementos únicos:
M = randi([1 7], [1500 1]);
Opción 1: tabular
t = tabulate(M);
counts1 = t(t(:,2)~=0, 2);
Opción 2: hist / histc
counts2_1 = hist( M, numel(unique(M)) );
counts2_2 = histc( M, unique(M) );
Opción 3: accumarray
counts3 = accumarray(M, ones(size(M)), [], @sum);
%# or simply: accumarray(M, 1);
Opción 4: sort / diff
[MM idx] = unique( sort(M) );
counts4 = diff([0;idx]);
Opción 5: arrayfun
counts5 = arrayfun( @(x)sum(M==x), unique(M) );
Opción 6: bsxfun
counts6 = sum( bsxfun(@eq, M, unique(M)'') )'';
Opción 7: escasa
counts7 = full(sparse(M,1,1));
Eche un vistazo a Determinar y cuente valores únicos de una matriz .
O, para contar el número de ocurrencias de 5
, simplemente hazlo
sum(your_matrix == 5)
Este es un muy buen archivo de funciones disponible en Matlab Central File Exchange.
Este archivo de función está totalmente vectorizado y, por lo tanto, es muy rápido. Además, en comparación con la función a la que se hace referencia en la respuesta de aioobe, esta función no utiliza la función de accumarray, por lo que esto es incluso compatible con versiones anteriores de Matlab. Además, funciona para matrices de celdas, así como matrices numéricas.
SOLUCIÓN: Puede usar esta función junto con la función incorporada de matlab, "única".
occurance_count = countmember (único (M), M)
occurance_count será una matriz numérica con el mismo tamaño que el de unique (M) y los diferentes valores de octention_count array corresponderán al recuento de los valores correspondientes (mismo índice) en unique (M).
Supongamos que w contiene números de semana ([1: 7])
n = histc(M,w)
si no conoce el rango de números en M:
n = histc(M,unique(M))
Es como un comando SQL Group by!
Una forma en que puede realizar esta operación para todos los valores del 1 al 7 a la vez es usar la función 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
Use nnz en lugar de sum. No es necesario que las matrices de doble invocación colapsen en vectores y es probablemente más rápido que la suma.
nnz(your_matrix == 5)
esto sería perfecto porque estamos haciendo operaciones en matriz, y la respuesta debería ser un solo número
sum(sum(matrix==value))