MATLAB Language
Использование функции `accumarray ()`
Поиск…
Вступление
accumarray
позволяет агрегировать элементы массива различными способами, потенциально применяя некоторую функцию к элементам процесса. accumarray
можно рассматривать как легкий редуктор (см. также: Введение в MapReduce ).
Этот accumarray
будет содержать общие сценарии, в которых особенно полезен accumarray
.
Синтаксис
- 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)
параметры
параметр | подробности |
---|---|
subscriptArray | Матрица индексов, заданная как вектор индексов, матрица индексов или массив ячеек индексных векторов. |
valuesArray | Данные, заданные как вектор или скаляр. |
sizeOfOutput | Размер выходного массива, заданный как вектор положительных целых чисел. |
funcHandle | Функция, применяемая к каждому набору элементов во время агрегации, указанная как дескриптор функции или [] . |
fillVal | Заполнить значение, когда subs не ссылается на каждый элемент на выходе. |
isSparse | Должен ли выход быть разреженным массивом? |
замечания
- Представлен в MATLAB v7.0.
Ссылки :
- «
accumarray
», Лорен Шуре , 20 февраля 2008 года . -
accumarray
в официальной документации MATLAB.
Поиск максимального значения среди элементов, сгруппированных другим вектором
Это официальный пример MATLAB
Рассмотрим следующий код:
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);
На приведенном ниже accumarray
процесс вычисления, выполненный с помощью accumarray
в этом случае:
В этом примере сначала собираются все значения, имеющие один и тот же month
, а затем функция, указанная 4- м входом для accumarray
(в данном случае, @max
), применяется к каждому из таких наборов.
Примените фильтр к изображениям и установите каждый пиксель как среднее для результата каждого патча
Многие современные алгоритмы обработки изображений используют патчи - их основной элемент для работы.
Например, можно было бы разложить патчи (см. Алгоритм BM3D).
Однако при создании формы изображения обработанных патчей у нас есть много результатов для одного и того же пикселя.
Один из способов борьбы с ним - взять среднее (эмпирическое среднее) всех значений одного и того же пикселя.
Следующий код показывает, как разбить изображение на патчи, и они восстанавливают изображение из патчей, используя среднее значение, используя [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]);