numel nume1 nnz for español comando matlab count matrix

matlab - nume1 - Calcule los valores más comunes



numel matlab español (5)

Si tengo una matriz A con n valores que abarcan desde 65:90. ¿Cómo obtengo los 10 valores más comunes en A? Quiero que el resultado sea una matriz B de 10x2 con los 10 valores comunes en la primera columna y los tiempos que aparece en la segunda columna.


Diablos, aquí hay otra solución, todos los comandos integrados simples

[V, I] = unique(sort(A(:))); M = sortrows([V, diff([0; I])], -2); Top10 = M(1:10, :);

Primera línea: ordena todos los valores y luego busca el desplazamiento donde comienza cada nuevo valor en la lista ordenada. Segunda línea: calcule las diferencias de compensación por valor único y clasifique esos resultados.

Por cierto, solo recomendaría este método si el rango de números posibles es realmente grande, como [0,1E8]. En ese caso, algunos de los otros métodos pueden tener un error de falta de memoria.


Esto se resuelve fácilmente usando arrayfun ()

A = [...]; % Your target matrix with values 65:90 labels = 65:90 % Possible values to look for nTimesOccured = arrayfun(@(x) sum(A(:) == x), labels); [sorted sortidx] = sort(nTimesOccured, ''descend''); B = [labels(sortidx(1:10))'' sorted(1:10)''];


Podemos agregar una cuarta opción usando la tabulación de Statistics Toolbox:

A = randi([65 90], [1000 1]); %# thousand random integers in the range 65:90 t = sortrows(tabulate(A), -2); %# compute sorted frequency table B = t(1:10, 1:2); %# take the top 10


esto también se puede resolver con accumarray

ncounts = accumarray(A(:),1); %ncounts should now be a 90 x 1 vector of counts [vals,sidx] = sort(ncounts,''descend''); %vals has the counts, sidx has the number B = [sidx(1:10),vals(1:10)];

accumarray no es tan rápido como debería ser, pero a menudo más rápido que otras operaciones de este tipo. Me tomó varios escaneos de su página de ayuda para entender qué demonios está haciendo. para sus propósitos, es probablemente más lento que la solución histc, pero un poco más directo.

--edit: olvidé el ''1'' en la llamada de accumarray.


A = [65 82 65 90; 90 70 72 82]; % Your data range = 65:90; res = [range; histc(A(:)'', range)]''; % res has values in first column, counts in second.

Ahora todo lo que tienes que hacer es ordenar la matriz de res en la segunda columna y tomar las primeras 10 filas.

sortedres = sortrows(res, -2); % sort by second column, descending first10 = sortedres(1:10, :)