MATLAB Language
Uso de la función "úmarray () `
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 :
- "
accumarray
", por Loren Shure , 20 de febrero de 2008 . -
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:
En este ejemplo, todos los valores que tienen el mismo month
se recopilan primero, y luego se aplica la función especificada por la 4ª 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]);