Suche…


Einführung

accumarray ermöglicht das accumarray von Elementen eines Arrays auf verschiedene Weise, wodurch möglicherweise eine Funktion auf die Elemente im Prozess angewendet wird. accumarray kann als leichtes Reduktionsmittel betrachtet werden (siehe auch: Einführung in MapReduce ).

Dieses Thema enthält häufig vorkommende Szenarien, in denen accumarray besonders nützlich ist.

Syntax

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

Parameter

Parameter Einzelheiten
subscriptArray Indexmatrix, angegeben als Vektor von Indizes, Matrix von Indizes oder Zellenfeld von Indexvektoren.
valuesArray Daten, die als Vektor oder Skalar angegeben werden.
sizeOfOutput Größe des Ausgabearrays, angegeben als Vektor positiver Ganzzahlen.
funcHandle Funktion, die auf jeden Satz von Elementen während der Aggregation angewendet werden soll, als Funktions-Handle oder [] .
fillVal Füllwert, wenn subs nicht auf jedes Element in der Ausgabe verweist.
isSparse Sollte die Ausgabe ein spärliches Array sein?

Bemerkungen

  • Eingeführt in MATLAB v7.0.

Referenzen :

  1. " accumarray " von Loren Shure , 20. Februar 2008
  2. accumarray in der offiziellen MATLAB-Dokumentation.

Ermittlung des Maximalwerts unter Elementen, die nach einem anderen Vektor gruppiert sind

Dies ist ein offizielles MATLAB-Beispiel

Betrachten Sie den folgenden 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);

Das folgende Bild zeigt den Berechnungsprozess, den accumarray in diesem Fall accumarray :

Erläuterung des Berechnungsprozesses

In diesem Beispiel werden alle Werte , die die gleiche haben month werden zuerst gesammelt, und dann wird die Funktion , die durch das 4. Eingabe angegebenen accumarray (in diesem Fall @max ) an jedem solchen Satz angewendet.

Wenden Sie den Filter auf Image-Patches an und stellen Sie jedes Pixel als Mittelwert des Ergebnisses jedes Patches ein

Viele moderne Bildverarbeitungsalgorithmen verwenden Patches, um daran zu arbeiten.
Zum Beispiel könnte man Patches entrauschen (siehe BM3D-Algorithmus).

Beim Erstellen des Bildes aus den verarbeiteten Flecken haben wir jedoch viele Ergebnisse für dasselbe Pixel.
Eine Möglichkeit, damit umzugehen, ist der Durchschnittswert (empirischer Mittelwert) aller Werte desselben Pixels.

Der folgende Code zeigt, wie Sie ein Bild in Patches [accumarray()][1] und das Bild aus Patches mithilfe des Durchschnitts mithilfe von [accumarray()][1] rekonstruieren:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow