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 :

  1. " accumarray ", door Loren Shure , 20 februari 2008 .
  2. 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:

Uitleg van het berekeningsproces

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]);


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow