Sök…


Introduktion

accumarray gör det möjligt att aggregera objekt i en matris på olika sätt, vilket potentiellt kan tillämpa någon funktion på artiklarna i processen. accumarray kan ses som en lätt reducer (se även: Introduktion till MapReduce ).

Detta ämne kommer att innehålla vanliga scenarier där accumarray är särskilt användbar.

Syntax

  • ackumulator (subscriptArray, ValuesArray)
  • ackumulator (subscriptArray, ValuesArray, sizeOfOutput)
  • ackumulator (subscriptArray, ValuesArray, sizeOfOutput, funcHandle)
  • ackumulator (subscriptArray, ValuesArray, sizeOfOutput, funcHandle, fillVal)
  • ackumulator (subscriptArray, ValuesArray, sizeOfOutput, funcHandle, fillVal, isSparse)

parametrar

Parameter detaljer
subscriptArray Prenumerationsmatris, specificerad som en vektor av index, matris av index eller celluppsättning av indexvektorer.
valuesArray Data som anges som en vektor eller en skalar.
sizeOfOutput Storleken på utmatningsgruppen, specificerad som en vektor för positiva heltal.
funcHandle Funktion som ska tillämpas på varje uppsättning objekt under aggregering, specificerad som ett funktionshandtag eller [] .
fillVal Fyllningsvärde, för när subs inte refererar till varje element i utgången.
isSparse Bör utgången vara en gles grupp?

Anmärkningar

  • Introducerad i MATLAB v7.0.

Referenser :

  1. "Under-uppskattad accumarray ", av Loren Shure , 20 februari 2008 .
  2. accumarray i den officiella MATLAB-dokumentationen.

Hitta det maximala värdet bland element grupperade med en annan vektor

Detta är ett officiellt MATLAB-exempel

Tänk på följande kod:

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

Bilden nedan visar beräkningsprocessen som görs med accumarray i detta fall:

Förklaring av beräkningsprocessen

I det här exemplet samlas först in alla värden som har samma month och sedan tillämpas den funktion som anges av den 4: e ingången till accumarray (i detta fall @max ) på varje sådan uppsättning.

Applicera filter på bildpatcher och ställ in varje pixel som medelvärdet för resultatet för varje korrigeringsfil

Många moderna bildbehandlingsalgoritmer använder patchar är deras grundläggande element att arbeta med.
Till exempel kan man avslöja lappar (se BM3D-algoritm).

Men när vi bygger bilden från de bearbetade lapparna har vi många resultat för samma pixel.
Ett sätt att hantera det är att ta genomsnittet (empiriskt medelvärde) för alla värden på samma pixel.

Följande kod visar hur man delar upp en bild i korrigeringar och de rekonstruerar bilden från korrigeringar med genomsnittet med hjälp av [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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow