MATLAB Language
Utilisation de la fonction `accumarray ()`
Recherche…
Introduction
accumarray
permet d'agréger les éléments d'un tableau de différentes manières, en appliquant éventuellement une fonction aux éléments du processus. accumarray
peut être considéré comme un réducteur léger (voir aussi: Introduction à MapReduce ).
Cette rubrique contient des scénarios courants dans lesquels accumarray
est particulièrement utile.
Syntaxe
- 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)
Paramètres
Paramètre | Détails |
---|---|
subscriptArray | Matrice d'indices, spécifiée comme vecteur d'indices, matrice d'indices ou matrice de vecteurs d'index. |
valuesArray | Données spécifiées en tant que vecteur ou scalaire. |
sizeOfOutput | Taille du tableau de sortie, spécifiée comme vecteur d'entiers positifs. |
funcHandle | Fonction à appliquer à chaque ensemble d'éléments lors de l'agrégation, spécifiée en tant que descripteur de fonction ou [] . |
fillVal | Valeur de remplissage, lorsque subs ne référence pas chaque élément dans la sortie. |
isSparse | La sortie doit-elle être un tableau fragmenté? |
Remarques
- Introduit dans MATLAB v7.0.
Références :
- "
accumarray
sous-accumarray
", par Loren Shure , 20 février 2008 . -
accumarray
dans la documentation officielle de MATLAB.
Recherche de la valeur maximale parmi les éléments regroupés par un autre vecteur
Ceci est un exemple officiel de MATLAB
Considérez le code suivant:
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);
L'image ci-dessous illustre le processus de calcul effectué par accumarray
dans ce cas:
Dans cet exemple, toutes les valeurs ayant le même month
sont d'abord collectées, puis la fonction spécifiée par la 4 ème entrée d' accumarray
(dans ce cas, @max
) est appliquée à chaque ensemble.
Appliquer un filtre aux patchs d'image et définir chaque pixel comme la moyenne du résultat de chaque patch
De nombreux algorithmes de traitement d'image modernes utilisant des correctifs sont leur élément de base sur lequel travailler.
Par exemple, on pourrait débruiter les patchs (Voir Algorithme BM3D).
Pourtant, lors de la construction de l'image à partir des patchs traités, nous avons de nombreux résultats pour le même pixel.
Une façon de le gérer consiste à prendre la moyenne (moyenne empirique) de toutes les valeurs d’un même pixel.
Le code suivant montre comment fractionner une image en patches et reconstruire l'image à partir de patches en utilisant la moyenne en utilisant [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]);