Buscar..


Introducción

accumarray permite agregar elementos de una matriz de varias maneras, potencialmente aplicando alguna función a los elementos en el proceso. accumarray puede considerar la accumarray como un reductor ligero (ver también: Introducción a MapReduce ).

Este tema contendrá escenarios comunes en los que la accumarray es especialmente útil.

Sintaxis

  • acumulación (subscriptArray, valuesArray)
  • acumulación (subscriptArray, valuesArray, sizeOfOutput)
  • acumulación (subscriptArray, valuesArray, sizeOfOutput, funcHandle)
  • acumulación (subscriptArray, valuesArray, sizeOfOutput, funcHandle, fillVal)
  • acumulación (subscriptArray, valuesArray, sizeOfOutput, funcHandle, fillVal, isSparse)

Parámetros

Parámetro Detalles
subscriptArray Matriz de subíndices, especificada como un vector de índices, matriz de índices o matriz de celdas de vectores de índice.
valuesArray Datos, especificados como un vector o un escalar.
sizeOfOutput Tamaño de la matriz de salida, especificado como un vector de enteros positivos.
funcHandle Función que se aplicará a cada conjunto de elementos durante la agregación, especificada como un identificador de función o [] .
fillVal Valor de relleno, para cuando subs no hace referencia a cada elemento en la salida.
isSparse ¿Debería la salida ser una matriz dispersa?

Observaciones

  • Introducido en MATLAB v7.0.

Referencias :

  1. " accumarray ", por Loren Shure , 20 de febrero de 2008 .
  2. accumarray en la documentación oficial de MATLAB.

Encontrar el valor máximo entre los elementos agrupados por otro vector.

Este es un ejemplo oficial de MATLAB.

Considere el siguiente código:

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

La siguiente imagen muestra el proceso de cálculo realizado por el accumarray en este caso:

Explicación del proceso de cálculo.

En este ejemplo, todos los valores que tienen el mismo month se recopilan primero, y luego se aplica la función especificada por la entrada de accumarray (en este caso, @max ) a cada uno de estos conjuntos.

Aplicar filtro a los parches de imagen y establecer cada píxel como la media del resultado de cada parche

Muchos de los algoritmos modernos de procesamiento de imágenes utilizan parches, que son su elemento básico para trabajar.
Por ejemplo, uno podría eliminar parches (ver algoritmo BM3D).

Sin embargo, al crear la imagen a partir de los parches procesados ​​tenemos muchos resultados para el mismo píxel.
Una forma de lidiar con esto es tomando el promedio (Promedio empírico) de todos los valores del mismo píxel.

El siguiente código muestra cómo dividir una imagen en parches y reconstruir la imagen a partir de parches usando el promedio utilizando [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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow