19.4 累積
計算を実行するときに配列の要素をインデックスに従って分類できる場合は、累積関数が役立ちます。
: A = accumarray (subs, vals) : A = accumarray (subs, vals, sz) : A = accumarray (subs, vals, sz, fcn) : A = accumarray (subs, vals, sz, fcn, fillval) : A = accumarray (subs, vals, sz, fcn, fillval, issparse)
ベクトルの要素をその添え字で定義された位置に累積して配列を作成します。
添字は行列subsの行によって定義され、値はvalsによって定義されます。subs の各行は、valsの値の 1 つに対応します。vals がスカラーの場合、subsの各行に使用されます。subs がベクトルのセル配列の場合、すべてのベクトルは同じ長さである必要があり、 k番目のベクトルの添字は結果の k番目の次元に対応している必要があります。
行列のサイズは、添え字自体によって決まります。ただし、szが定義されている場合は、行列のサイズが決まります。szの長さは、 subsの列数に対応している必要があります。例外として、subs に列が 1 つしかない場合は、sz はベクトルの次元になり、subsの添え字はそのベクトルのインデックスとして扱われます。
のデフォルトのアクションはaccumarray、同じ添字を持つ要素を合計することです。この動作は、 fcn関数を定義することで変更できます。これは、列ベクトルを受け入れてスカラーを返す関数または関数ハンドルである必要があります。関数の結果は、添字の順序に依存してはなりません。
返される配列の要素のうち、添え字が関連付けられていない要素はゼロに設定されます。fillval を他の値に定義すると、これらの値を定義できます。ただし、この動作はfcnの特定の値では変更されます。fcnが@min (それぞれ、@max) の場合、結果は、valsが整数型の場合は最小 (それぞれ、最大) の整数で埋められ、 valsが論理型の場合は論理偽 (それぞれ、論理真)で埋められ、 fillvalがゼロですべての値が非正 (それぞれ、非負) の場合はゼロで埋められ、それ以外の場合は NaN で埋められます。
デフォルトではaccumarray完全な行列を返します。issparse が論理的に true の場合は 、代わりにスパース行列が返されます。
次の例では、ベクトルxaccumarrayから取得した 2 列目の各数値の出現回数を最初の列にカウントする頻度表を作成します。 を使用して、 x のすべての繰り返し要素に 同じインデックスを割り当てていることに注意してください ( を参照)。 uniqueunique
x = [91, 92, 90, 92, 90, 89, 91, 89, 90, 100, 100, 100];
[u, ~, j] = unique (x);
[accumarray(j', 1), u']
⇒ 2 89
3 90
2 91
2 92
3 100
別の例では、結果が多次元 3D 配列となり、出力にデフォルト値 (ゼロ) が表示されます。
accumarray ([1, 1, 1;
2, 1, 2;
2, 3, 2;
2, 1, 2;
2, 3, 2], 101:105)
⇒ ans(:,:,1) = [101, 0, 0; 0, 0, 0]
⇒ ans(:,:,2) = [0, 0, 0; 206, 0, 208]
スパースオプションはsparse コンストラクタの代替として使用できます(を参照sparse)。つまり、
sparse (i, j, sv)
accumarrayは次のよう に書くことができる。
accumarray ([i, j], sv', [], [], 0, true)
繰り返しインデックスの場合は、sparse対応する値を追加します。代わりに最小値を取得するには、min累積関数として使用します。
accumarray ([i, j], sv', [], @min, 0, true)
非スパースの場合の accumarray の複雑さは一般に O(M+N) です。ここで、N は添え字の数、M は最大添え字です (多次元の場合は線形化されます)。fcn が (デフォルト)、、または のいずれかの場合 、@sum最適@max化 @minされ@(x) {x}たコード パスが使用されます。一般的なリダクション関数の場合、インタープリターのオーバーヘッドが大きな役割を果たす可能性があり、accumarray を複数回呼び出して結果をベクトル化して計算する方が効率的な場合があることに注意してください。
See also: accumdim, unique, sparse.
: A = accumdim (subs, vals) : A = accumdim (subs, vals, dim) : A = accumdim (subs, vals, dim, n) : A = accumdim (subs, vals, dim, n, fcn) : A = accumdim (subs, vals, dim, n, fcn, fillval)
配列のスライスを、指定された次元に沿ってその添字によって定義された位置に累積して、配列を作成します。
添字はインデックス ベクトルsubsによって定義されます。次元はdimによって指定されます。指定されていない場合は、最初の非シングルトン次元がデフォルトになります。subs の長さはと等しくなければなりません。 size (vals, dim)
作業次元における結果マトリックスの範囲は、添え字自体によって決まります。ただし、nが定義されている場合は、それがこの範囲を決定します。
のデフォルトの動作はaccumdim、同じ添え字を持つサブ配列を合計することです。この動作は 、 fcn関数を定義することで変更できます。これは、配列と次元を受け入れ、この次元に沿って配列を縮小する関数または関数ハンドルである必要があります。特別な例外として、組み込み関数minと max関数を直接使用することができ、accumdim 呼び出しで使用される中央の空の引数を考慮します。
返される配列のスライスのうち、添え字が関連付けられていない部分はゼロに設定されます。fillvalを他の値に定義すると、これらの値を定義できるようになります。
の使用例は次のaccumdimとおりです。
accumdim ([1, 2, 1, 2, 1], [ 7, -10, 4;
-5, -12, 8;
-12, 2, 8;
-10, 9, -3;
-5, -3, -13])
⇒ [-10,-11,-1;-15,-3,5]
See also: accumarray.