vectores una programar numero matriz matrices llenar identidad for extraer elementos matlab count matrix

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));



Este es un muy buen archivo de funciones disponible en Matlab Central File Exchange.

countmember.m enlace

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)

Doc


esto sería perfecto porque estamos haciendo operaciones en matriz, y la respuesta debería ser un solo número

sum(sum(matrix==value))