MATLAB Language
`accumarray()`関数の使い方
サーチ…
前書き
accumarray
使用すると、さまざまな方法で配列のアイテムを集約し、プロセス内のアイテムに関数を適用することができます。 accumarray
は軽量レデューサーと考えることができます( MapReduceの紹介も参照してください)。
このトピックでは、 accumarray
が特に有用な一般的なシナリオをaccumarray
ます。
構文
- accumarray(subscriptArray、valuesArray)
- accumarray(subscriptArray、valuesArray、sizeOfOutput)
- accumarray(subscriptArray、valuesArray、sizeOfOutput、funcHandle)
- accumarray(サブスクリプト配列、valuesArray、sizeOfOutput、funcHandle、fillVal)
- accumarray(サブスクリプト配列、valuesArray、sizeOfOutput、funcHandle、fillVal、isSparse)
パラメーター
パラメータ | 詳細 |
---|---|
subscriptArray | インデックスのベクトル、インデックスの行列、またはインデックスベクトルのセル配列として指定された添字行列。 |
valuesArray | ベクトルまたはスカラーとして指定されたデータ。 |
sizeOfOutput | 正の整数のベクトルとして指定された出力配列のサイズ。 |
funcHandle | 関数ハンドルまたは[] として指定された、集計中の各項目セットに適用される関数。 |
fillVal | subs 値が出力の各要素を参照しない場合のFill値。 |
isSparse | 出力は疎な配列であるべきですか? |
備考
- MATLAB v7.0で導入されました。
参考文献 :
- 2008年2月20日のLoren Shureによる "Under-appreciated
accumarray
" -
accumarray
の公式マニュアルにある「accumarray
してください。
別のベクトルでグループ化された要素の中で最大値を見つける
これは公式の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
による計算プロセスを示しています。
この例では、同じmonth
すべての値が最初に収集され、次に、 accumarray
への4 番目の入力(この例では@max
)で指定された関数がそのような各セットに適用されます。
画像パッチにフィルタを適用し、各ピクセルを各パッチの結果の平均として設定する
近代的な画像処理アルゴリズムの多くは、作業するための基本要素です。
たとえば、パッチを除去することができます(BM3Dアルゴリズムを参照)。
しかし、処理されたパッチの画像を構築するときには、同じピクセルに対して多くの結果が得られます。
それに対処する1つの方法は、同じピクセルのすべての値の平均(経験的平均)を取ることです。
次のコードは、イメージをパッチに分割し、 [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