data matlab sum histogram

data - ¿Hay alguna forma para que matlab sume una matriz de acuerdo con los contenedores especificados, NO por la iteración? Mejor si hay una función buildin para esto



bin en matlab (3)

Por ejemplo, si

A = [7,8,1,1,2,2,2]; % the bins (or subscripts) B = [2,1,1,1,1,1,2]; % the array

luego, la función deseada "binsum" tiene dos salidas, una son los contenedores y la otra es la suma. Simplemente agrega valores en B de acuerdo con los subíndices en A. Por ejemplo, para 2, la suma es 1 + 1 + 2 = 4, para 1 es 1 + 1 = 2.

[bins, sums] = binsum(A,B); bins = [1,2,7,8] sums = [2,4,2,1]

Los elementos en "contenedores" no necesitan ordenarse, sino que deben corresponder a elementos en "sumas". Esto seguramente se puede hacer mediante iteraciones "a favor", pero no se desea la iteración "a favor" , porque hay un problema de rendimiento. Lo mejor es que haya una función de compilación en esto.

¡Muchas gracias!


Este es otro trabajo para accumarray

A = [7,8,1,1,2,2,2]; % the bins (or subscripts) B = [2,1,1,1,1,1,2]; % the array sums = accumarray(A.'', B.'').''; bins = unique(A);

Resultados:

>> bins bins = 1 2 7 8 sums = 2 4 0 0 0 0 2 1

El índice en sums corresponde al valor del bin, por lo que sums(2) = 4 . Puede usar nonzeros para eliminar los contenedores no utilizados de modo que los bins(n) correspondan a sums(n)

sums = nonzeros(sums).''; sums = 2 4 2 1

o, para generar esta forma de sums en una línea:

sums = nonzeros(accumarray(A.'', B.'')).'';


Otra posibilidad es usar sparse y luego find .

  • Suponiendo que A contiene enteros positivos,

    [bins, ~, sums] = find(sparse(A, 1, B));

    Esto funciona porque sparse automáticamente agrega valores (tercera entrada) para posiciones coincidentes (como se define en las dos primeras entradas).

  • Si A puede contener valores arbitrarios, también necesita una llamada a unique , y find puede ser reemplazado por nonzeros :

    [bins, ~, labels]= unique(A); sums = nonzeros(sparse(labels, 1, B));


Aquí hay una solución que usa sort y cumsum :

[s,I]=sort(A); c=cumsum(B(I)); k= [s(1:end-1)~=s(2:end) true]; sums = diff([0 c(k)]) bins = s(k)