MATLAB Language
Gebruik van de functie `accumarray ()`
Zoeken…
Invoering
accumarray
maakt het mogelijk om items van een array op verschillende manieren te aggregeren, waardoor mogelijk een functie op de items in het proces wordt toegepast. accumarray
kan worden gezien als een lichtgewicht reductiemiddel (zie ook: Inleiding tot MapReduce ).
Dit onderwerp bevat veel voorkomende scenario's waarbij accumarray
vooral nuttig is.
Syntaxis
- accumarray (subscriptArray, valuesArray)
- accumarray (subscriptArray, waardenArray, sizeOfOutput)
- accumarray (subscriptArray, waardenArray, sizeOfOutput, funcHandle)
- accumarray (subscriptArray, waardenArray, sizeOfOutput, funcHandle, fillVal)
- accumarray (subscriptArray, waardenArray, sizeOfOutput, funcHandle, fillVal, isSparse)
parameters
Parameter | Details |
---|---|
subscriptArray | Subscriptmatrix, gespecificeerd als een vector van indices, matrix van indices of celarray van indexvectoren. |
valuesArray | Gegevens, gespecificeerd als een vector of een scalair. |
sizeOfOutput | Grootte van uitvoerarray, opgegeven als een vector van positieve gehele getallen. |
funcHandle | Functie die moet worden toegepast op elke set items tijdens aggregatie, gespecificeerd als een functie-handle of [] . |
fillVal | Vulwaarde, voor wanneer subs niet naar elk element in de uitvoer verwijst. |
isSparse | Moet de uitvoer een schaars array zijn? |
Opmerkingen
- Geïntroduceerd in MATLAB v7.0.
Referenties :
- "
accumarray
", door Loren Shure , 20 februari 2008 . -
accumarray
in de officiële MATLAB-documentatie.
De maximale waarde vinden tussen elementen gegroepeerd door een andere vector
Dit is een officieel MATLAB-voorbeeld
Overweeg de volgende code:
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);
De onderstaande afbeelding toont het berekeningsproces van accumarray
in dit geval:
In dit voorbeeld worden alle waarden die gelijk zijn month
worden eerst verzameld en vervolgens de door de 4e invoer voor de functie accumarray
(in casu @max
) wordt toegepast op elke dergelijke set.
Pas filter toe op afbeeldingspatches en stel elke pixel in als het gemiddelde van het resultaat van elke patch
Veel moderne algoritmen voor beeldverwerking gebruiken patches als basiselement om aan te werken.
Je zou bijvoorbeeld patches kunnen ontkennen (zie BM3D algoritme).
Maar bij het bouwen van de afbeelding uit de verwerkte vlakken hebben we veel resultaten voor dezelfde pixel.
Een manier om hiermee om te gaan is het gemiddelde (empirisch gemiddelde) van alle waarden van dezelfde pixel nemen.
De volgende code laat zien hoe een afbeelding in patches kan worden [accumarray()][1]
en hoe de afbeelding uit patches kan worden gereconstrueerd met behulp van het gemiddelde met behulp van [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]);