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 aunique
, yfind
puede ser reemplazado pornonzeros
:[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)