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 :

  1. " accumarray sous- accumarray ", par Loren Shure , 20 février 2008 .
  2. 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:

Explication du processus de calcul

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow