MATLAB Language
Verwendung der Funktion 'Accarray ()'
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 :
- "
accumarray
" von Loren Shure , 20. Februar 2008 -
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
:
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]);