Ricerca…


introduzione

accumarray consente di aggregare elementi di un array in vari modi, potenzialmente applicando alcune funzioni agli elementi nel processo. accumarray può essere pensato come un riduttore leggero (vedi anche: Introduzione a MapReduce ).

Questo argomento conterrà scenari comuni in cui accumarray è particolarmente utile.

Sintassi

  • accumarray (subscriptArray, valuesArray)
  • accumarray (subscriptArray, valuesArray, sizeOfOutput)
  • accumarray (subscriptArray, valuesArray, sizeOfOutput, funcHandle)
  • accumarray (subscriptArray, valuesArray, sizeOfOutput, funcHandle, fillVal)
  • accumarray (subscriptArray, valuesArray, sizeOfOutput, funcHandle, fillVal, isSparse)

Parametri

Parametro Dettagli
subscriptArray Matrice di pedici, specificata come vettore di indici, matrice di indici o matrice di celle di vettori di indice.
valuesArray Dati, specificati come vettore o scalare.
sizeOfOutput Dimensione della matrice di output, specificata come vettore di numeri interi positivi.
funcHandle Funzione da applicare a ogni serie di elementi durante l'aggregazione, specificata come handle di funzione o [] .
fillVal Valore di riempimento, per quando i subs non fanno riferimento a ciascun elemento nell'output.
isSparse L'output dovrebbe essere un array sparse?

Osservazioni

  • Introdotto in MATLAB v7.0.

Riferimenti :

  1. "Under-apprezzato accumarray ", di Loren Shure , 20 febbraio 2008 .
  2. accumarray nella documentazione ufficiale di MATLAB.

Trovare il valore massimo tra gli elementi raggruppati da un altro vettore

Questo è un esempio ufficiale di MATLAB

Considera il seguente codice:

month = [1;1;2;3;8;1;3;4;9;11;9;12;3;4;11];
temperature = [57;61;60;62;45;59;64;66;40;56;38;65;61;64;55];
maxTemp = accumarray(month,temperature,[],@max);

L'immagine sotto mostra il processo di calcolo fatto da accumarray in questo caso:

Spiegazione del processo di calcolo

In questo esempio, tutti i valori che hanno lo stesso month vengono prima raccolti e quindi la funzione specificata dal 4 ° input per accumarray (in questo caso, @max ) viene applicata a ciascun set.

Applica il filtro alle patch delle immagini e imposta ciascun pixel come media del risultato di ciascuna patch

Molti moderni algoritmi di elaborazione delle immagini utilizzano le patch come elemento di base su cui lavorare.
Ad esempio, è possibile eliminare le patch (vedere Algoritmo BM3D).

Tuttavia, quando costruisci l'immagine sotto forma di patch elaborate, abbiamo molti risultati per lo stesso pixel.
Un modo per affrontarlo è prendere la media (media empirica) di tutti i valori dello stesso pixel.

Il seguente codice mostra come rompere un'immagine in patch e ricostruire l'immagine dalle patch usando la media usando [accumarray()][1] :

numRows = 5;
numCols = 5;

numRowsPatch = 3;
numColsPatch = 3;

% The Image
mI = rand([numRows, numCols]);

% Decomposing into Patches - Each pixel is part of many patches (Neglecting
% boundariwes, each pixel is part of (numRowsPatch * numColsPatch) patches).
mY = ImageToColumnsSliding(mI, [numRowsPatch, numColsPatch]);

% Here one would apply some operation which work on patches

% Creating image of the index of each pixel
mPxIdx = reshape(1:(numRows * numCols), [numRows, numCols]);

% Creating patches of the same indices
mSubsAccu = ImageToColumnsSliding(mPxIdx, [numRowsPatch, numColsPatch]);

% Reconstruct the image - Option A
mO = accumarray(mSubsAccu(:), mY(:)) ./ accumarray(mSubsAccu(:), 1);

% Reconstruct the image - Option B
mO = accumarray(mSubsAccu, mY(:), [(numRows * numCols), 1], @(x) mean(x));

% Rehsape the Vector into the Image
mO = reshape(mO, [numRows, numCols]);


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow