Поиск…


Вступление

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.

Ссылки :

  1. « accumarray », Лорен Шуре , 20 февраля 2008 года .
  2. 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]);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow