MATLAB Language
Utilizzo della funzione `accumarray ()`
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 :
- "Under-apprezzato
accumarray
", di Loren Shure , 20 febbraio 2008 . -
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:
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]);