Szukaj…


Wprowadzenie

accumarray pozwala agregować elementy tablicy na różne sposoby, potencjalnie stosując jakąś funkcję do elementów w procesie. accumarray może być traktowany jako lekki reduktor (patrz także: Wprowadzenie do MapReduce ).

Ten temat będzie zawierał typowe scenariusze, w których accumarray jest szczególnie przydatna.

Składnia

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

Parametry

Parametr Detale
subscriptArray Matryca indeksu dolnego, określona jako wektor indeksów, macierz indeksów lub tablica komórek wektorów indeksowych.
valuesArray Dane określone jako wektor lub skalar.
sizeOfOutput Rozmiar tablicy wyjściowej, określony jako wektor dodatnich liczb całkowitych.
funcHandle Funkcja do zastosowania do każdego zestawu elementów podczas agregacji, określona jako uchwyt funkcji lub [] .
fillVal Wypełnij wartość, gdy subs nie odwołuje się do każdego elementu na wyjściu.
isSparse Czy wynik powinien być rzadką tablicą?

Uwagi

  • Wprowadzone w MATLAB v7.0.

Referencje :

  1. accumarray ”, autor: Loren Shure , 20 lutego 2008 r .
  2. accumarray w oficjalnej dokumentacji MATLAB.

Znajdowanie maksymalnej wartości wśród elementów pogrupowanych według innego wektora

To jest oficjalny przykład MATLAB

Rozważ następujący kod:

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

Poniższy obraz pokazuje proces obliczeń wykonywanych przez accumarray w tym przypadku:

Objaśnienie procesu obliczeniowego

W tym przykładzie najpierw zbierane są wszystkie wartości z tego samego month , a następnie do każdego takiego zestawu stosowana jest funkcja określona przez 4- ty sygnał wejściowy do accumarray (w tym przypadku @max ).

Zastosuj filtr do poprawek obrazu i ustaw każdy piksel jako średnią wyniku każdej łatki

Wiele nowoczesnych algorytmów przetwarzania obrazu wykorzystuje łatki, które są ich podstawowym elementem do pracy.
Na przykład można zrezygnować z łatek (patrz Algorytm BM3D).

Jednak podczas budowania obrazu z przetworzonych poprawek mamy wiele wyników dla tego samego piksela.
Jednym ze sposobów radzenia sobie z tym jest przyjęcie średniej (średniej empirycznej) wszystkich wartości tego samego piksela.

Poniższy kod pokazuje, jak rozbić obraz na łatki, a one rekonstruują obraz z łatek przy użyciu średniej za pomocą [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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow