サーチ…


前書き

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で導入されました。

参考文献

  1. 2008年2月20日のLoren Shureよる "Under-appreciated accumarray "
  2. 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