MATLAB Language
Zastosowanie funkcji `accumarray ()`
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 :
- „
accumarray
”, autor: Loren Shure , 20 lutego 2008 r . -
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:
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]);