ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

accumarray

累算による配列作成

構文

  • A = accumarray(subs,val)
  • A = accumarray(subs,val,sz)
  • A = accumarray(subs,val,sz,fun)
  • A = accumarray(subs,val,sz,fun,fillval)
  • A = accumarray(subs,val,sz,fun,fillval,issparse)

説明

A = accumarray(subs,val) は、subs の添字を使用してベクトル val要素の累積によって、配列 A を返します。mn 列の行列 subs の各行の値は、n 次元の添字を出力 A に定義します。subs が列ベクトルの場合、各行の値は行の添字を出力の列ベクトルに定義します。

subs の i 行目は、ベクトル val の i 番目の要素に対応します。関数は、subs 内に同一の添字をもつ val のすべての要素を集めて、関数 @sum を適用し、その結果を各添字に対応する A の場所に格納します。subs のどの行からも参照されない A の要素には、値 0 が入ります。

A = accumarray(subs,val,sz) は、サイズが sz の配列 A を返します。sz は、出力のサイズを定義する正の整数のベクトルとして、あるいは subs の添字で出力のサイズが決定される [] として指定します。subs が後の行、列または次元を参照していないが、それらを出力には入れる場合に sz を使用します。

A = accumarray(subs,val,sz,fun) は、subs 内に同一の添字をもつ val の要素の各サブセットに関数 fun を適用します。@ 記号を使用して fun を指定するか (たとえば、@mean)、あるいは [] を指定して既定の関数 @sum を使用します。

A = accumarray(subs,val,sz,fun,fillval) は、subs のどの添字にも参照されていない A の要素をすべてスカラー値 fillval で埋めます。fillval 入力は、fun によって返される値と同じクラスでなければなりません。fillval[] と指定すると、既定値 0 が使用されます。

A = accumarray(subs,val,sz,fun,fillval,issparse) は配列 A を返します。これは、スカラー issparsetrue または 1 の場合はスパース、false または 0 の場合は非スパースになります。既定の設定では、出力 A は非スパースです。

すべて折りたたむ

ビン数を求める

添字のベクトル subs を作成します。

subs = [1; 2; 4; 2; 4]
subs =
     1 
     2 
     4 
     2 
     4 

val = 1accumarray を使用して、subs 内の同一の添字の数をカウントします。

A = accumarray(subs,1)
A =

     1
     2
     0
     2

結果は、ビン数のベクトルになります。histc(subs,1:4) を使用しても同じ答えを取得できます。ただし、accumarray は高次元のグリッドでもビン数を計算できます。

データの累積

データのベクトル val および同じ長さの添字の値のベクトル subs を作成します。

val = 101:105';
subs = [1; 3; 4; 3; 4]
subs =
     1 
     3 
     4 
     3 
     4 

accumarray を使用して、subs 内に同一の添字をもつ val の値を合計します。

A = accumarray(subs,val)
A =
   101
     0
   206
   208

結果は、累積値のベクトルになります。subs の 2 番目と 4 番目の要素が 3 であるため、A(3)val の 2 番目と 4 番目の要素の合計になります。つまり、A(3) = 102 + 104 = 206 となります。また、subs には値 2 が含まれないため、A(2) = 0 となります。subs はベクトルであるため、出力 A もベクトルになります。A の長さは、max(subs,[],1) になります。

出力サイズの指定

データのベクトル val および添字の行列 subs を作成します。

val = 101:106';
subs = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1]
subs =

     1     1
     2     2
     3     2
     1     1
     2     2
     4     1

subs の添字により、出力の 4 行 2 列の行列が定義されます。

accumarray を使用して、subs 内に同一の添字をもつ val の値を合計します。

A = accumarray(subs,val)
A =

   205     0
     0   207
     0   103
   106     0

結果は、累積値の 4 行 2 列の行列になります。

accumarraysz 入力を使用して、4 行 4 列の行列を返します。各次元は既定のサイズ (この場合 4 行 2 列) 以上に指定できますが、これより小さくすることはできません。

A = accumarray(subs,val,[4 4])
A =

   205     0     0     0
     0   207     0     0
     0   103     0     0
   106     0     0     0

結果は、累積値の 4 行 4 列の行列になります。

カスタム関数の使用

データのベクトル val および添字の行列 subs を作成します。

val = [100.1 101.2 103.4 102.8 100.9 101.5]';
subs = [1 1; 1 1; 2 2; 3 2; 2 2; 3 2]
subs =

     1     1
     1     1
     2     2
     3     2
     2     2
     3     2

subs の添字により、出力の 3 行 2 列の行列が定義されます。

accumarrayfun 入力を使用して、subs 内に同一の添字をもつ val のデータのグループ内分散を計算します。fun@var として指定します。

A1 = accumarray(subs,val,[],@var)
A1 =

    0.6050         0
         0    3.1250
         0    0.8450

結果は、分散値の 3 行 2 列の行列になります。

また、fun がベクトル入力を受け取りスカラーを返していれば、無名関数として指定することもできます。追加のパラメーターを関数に渡す場合など、この方法が役立ちます。この場合、正規化パラメーターを指定して関数 var を使用します。

A2 = accumarray(subs,val,[],@(x) var(x,1))
A2 =

    0.3025         0
         0    1.5625
         0    0.4225

結果は、正規化された分散値の 3 行 2 列の行列になります。

ネイティブの値の合計

データのベクトル val および添字の行列 subs を作成します。

val = int8(10:15);
subs = [1 1 1; 1 1 1; 1 1 2; 1 1 2; 2 3 1; 2 3 2]
subs =

     1     1     1
     1     1     1
     1     1     2
     1     1     2
     2     3     1
     2     3     2

subs の添字により、出力の 2 x 3 x 2 の多次元配列が定義されます。

accumarray を使用して、subs 内に同一の添字をもつ val のデータ値を合計します。関数ハンドルを使用し、関数 sum'native' オプションを使用してネイティブの int8 整数クラスで値を合計します。

A = accumarray(subs,val,[],@(x) sum(x,'native'))
A(:,:,1) =

   21    0    0
    0    0   14


A(:,:,2) =

   25    0    0
    0    0   15

結果は、クラス int8 の 2 x 3 x 2 の多次元配列になります。

セル配列の値のグループ化

データのベクトル val および添字の行列 subs を作成します。

val = 1:10;
subs = [1 1;1 1;1 1;1 1;2 1;2 1;2 1;2 1;2 1;2 2]
subs =

     1     1
     1     1
     1     1
     1     1
     2     1
     2     1
     2     1
     2     1
     2     1
     2     2

subs の添字により、出力の 2 行 2 列の行列が定義されます。

accumarray を使用して val の要素をセル配列にグループ化します。

A = accumarray(subs,val,[],@(x) {x})
A = 

    [4x1 double]      []
    [5x1 double]    [10]

結果は、2 行 2 列のセル配列になります。

ベクトルの要素の順序が val での出現順序と同じであることを確認します。

A{2,1}
ans =

     5
     6
     7
     8
     9

subs の添字は並べ替えられているため、セル配列の数値ベクトルの要素の順序は、val での出現順序と同じになります。

データの順序に依存する関数の使用

データのベクトル val および添字の行列 subs を作成します。

val = 1:5;
subs = [1 2; 1 1; 1 2; 1 1; 2 3]
subs =

     1     2
     1     1
     1     2
     1     1
     2     3

subs の添字により、出力の 2 行 3 列の行列が定義されますが、出力 A の線形インデックスに対しては並べ替えられません。

fun = @(x) {x} を指定して、val の値をセル配列にグループ化します。

A = accumarray(subs,val,[],@(x) {x})
A = 

    [2x1 double]    [2x1 double]     []
              []              []    [5]

結果は、2 行 3 列のセル配列になります。

A{1,2} のベクトルを検証します。

A{1,2}
ans =

     3
     1

A{1,2} ベクトルの要素は、val とは異なる順序です。ベクトルの最初の要素は 1 でなく 3 です。subs の添字が線形インデックスに対して並べ替えられていない場合、accumarrayfun にデータを渡す際に val のデータの順序は必ずしも保持されません。fun で入力値を val での出現順序と同じにする必要があるような特殊なケースでは、出力の線形インデックスに対して subs のインデックスを並べ替えます。

この場合は、関数 sortrows で 2 つの入力と 2 つの出力を指定して、出力の線形インデックスに対して subsval を同時に並べ替えます。

[S,I] = sortrows(subs,[2,1]);
A = accumarray(S,val(I),[],@(x) {x});
A{1,2}
ans =

     1
     3

これで A{1,2} ベクトルの要素は並べ替えられた順序になります。

出力を NaN 値で埋める

データのベクトル val および添字の行列 subs を作成します。

val = 101:106';
subs = [1 1; 2 2; 3 3; 1 1; 2 2; 4 4]
subs =

     1     1
     2     2
     3     3
     1     1
     2     2
     4     4

subs の添字により、出力の 4 行 4 列の行列が定義されますが、16 個の要素のうち 4 個しか参照されません。既定では、他の 12 個の要素は出力で 0 になります。

accumarrayfillval 入力を使用して、その他の出力要素を NaN 値で埋めます。

A = accumarray(subs,val,[],[],NaN)
A =

   205   NaN   NaN   NaN
   NaN   207   NaN   NaN
   NaN   NaN   103   NaN
   NaN   NaN   NaN   106

結果は、NaN 値でパディングされた 4 行 4 列の行列になります。

出力のスパース性の変更

データのベクトル val および添字の行列 subs を作成します。

val = [34 22 19 85 53 77 99 6];
subs = [1 1; 400 400; 80 80; 1 1; 400 400; 400 400; 80 80; 1 1]
subs =

     1     1
    400  400
    80    80
     1     1
   400   400
   400   400
    80    80
     1     1

subs の添字により、出力の 400 行 400 列の行列が定義されますが、160,000 個の要素のうち 3 個しか参照されません。accumarray による操作の結果、非ゼロ要素の密度が低い大きな配列が出力される場合、出力をスパース行列として保存してストレージ スペースを節約できます。

accumarrayissparse 入力を使用して、スパース行列を返します。

A = accumarray(subs,val,[],[],[],true)
A =

   (1,1)      125
  (80,80)     118
 (400,400)    152

結果はスパース行列になります。sparse(subs(:,1),subs(:,2),val) を使用しても同じ答えを取得できます。

入力引数

すべて折りたたむ

subs — 添字行列インデックスのベクトル | インデックスの行列 | インデックス ベクトルのセル配列

インデックスのベクトル、インデックスの行列、またはインデックス ベクトルのセル配列として指定する添字行列。インデックスは、正の整数でなければなりません。

  • m 行 n 列の行列 subs の各行の値は、n 次元のインデックスを出力 A に指定します。たとえば、subs が 3 行 2 列の行列である場合、これには 3 つの 2 次元の添字が含まれます。また、subs にはインデックスの列ベクトルを指定することもできます。その場合、出力 A も列ベクトルになります。

  • subs の i 行目は、val の i 番目のデータ値に対応します。

このように、subs により、val のどのデータをグループ化するか、さらに最終的に出力内のどこに配置されるかが決定します。subs がインデックス ベクトルのセル配列である場合、各ベクトルは同じ長さでなければなりません。関数はこのベクトルを添字行列の列として扱います。

val — データベクトル | スカラー

ベクトルまたはスカラーとして指定するデータ。

  • val がベクトルの場合、subs の行数と同じ長さでなければなりません。

  • val がスカラーの場合、スカラー拡張されます。

どちらの場合も、subs の各行の添字と val のデータ値との間には、1 対 1 の対応が存在します。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char
複素数のサポート: はい

sz — 出力配列のサイズ[] (既定値) | 正の整数のベクトル

正の整数のベクトルまたは [] (既定の設定) として指定する出力配列のサイズ。既定のサイズの [] を指定する場合、subs の値により出力配列 A のサイズが決定します。

sz を正の整数のベクトルとして指定する場合、以下の特性を満たさなければなりません。

  • subsn > 1 個の列をもつ空でない mn 列の行列である場合、szn 個の要素をもち、論理テスト all(sz >= max(subs,[],1)) にパスしなければなりません。

  • subs が空でない列ベクトルの場合、sz は、[m 1] でなければなりません。ここで、m >= max(subs) です。

例: sz = [3 3]

fun — 関数[] (既定値) | 関数ハンドル

関数ハンドルまたは [] (既定の設定) として指定する関数。既定の関数は @sum です。関数 fun は、列ベクトルを受け入れ、数値、logical または char スカラー、あるいはスカラー cell を返さなければなりません。subs の添字が線形インデックスに応じて並べ替えられていない場合、fun はその入力データの値の順序に依存することはできません。

例: fun = @max

データ型: function_handle

fillval — 埋め込み値[] (既定値) | スカラー

スカラーまたは [] (既定の設定) として指定する埋め込み値。fillval の既定値は 0 です。subs が出力の各要素を参照していない場合、accumarray は出力を fillval で指定された値で埋めます。fillval のクラスは、fun で返された値と同じクラスでなければなりません。

issparse — 出力のスパース性false (既定値) | true | 1 | 0

true10 または false (既定の設定) として指定する出力のスパース性。出力配列をスパースにする場合、true または 1 を指定します。issparsetrue または 1 の場合、次のようにする必要があります。

  • fillval は、0 または [] でなければなりません。

  • val の値および fun の出力値は、両方とも double 型でなければなりません。

出力引数

すべて折りたたむ

A — 出力配列ベクトル | 行列 | 多次元配列

ベクトル、行列または多次元配列として返される出力配列。Afun で返される値と同じクラスになります。

sz が指定されていない場合、A のサイズは subs の入力に依存します。

  • subsn > 1 個の列をもつ空でない行列である場合、A はサイズが max(subs,[],1)n 次元配列になります。

  • subsn > 1 個の列をもつ空の行列である場合、A はサイズが 0 x 0 x ... x 0 の n 次元の空の配列になります。

  • subs が空でない列ベクトルの場合、A は長さ max(subs,[],1) の列ベクトルになります。subs が空の場合、A の長さは 0 になります。

詳細

すべて折りたたむ

要素の累積

次の図は、12 か月間で測定された温度データのベクトルに対する accumarray の動作を示しています。各月の最高の測定温度値を求めるために、accumarray は、month 内に同一の添字をもつ temperature の値の各グループに対して関数 max を適用します。

month には、出力の 5、6、7、10 の位置を指している値はありません。既定では、これらの要素は出力で 0 となりますが、fillval を使用して値を埋めることもできます。

ヒント

  • accumarray の動作は、関数 histc の動作と同様です。どちらの関数もデータをビンにグループ化します。

    • histc は、ビンのエッジを使用して連続値を 1 次元の範囲にグループ化します。

    • accumarray は n 次元の添字を使用してデータをグループ化します。

    • histc は、@sum を使用してビン数を返します。

    • accumarray は任意の関数をビンに適用できます。

    val = 1accumarray を使用すると histc の動作を再現できます。

  • 関数 sparseaccumarray と同様に累積を行います。

    • accumarray は n 次元の添字を使用してデータをビンにグループ化しますが、sparse は 2 次元の添字を使用してデータをビンにグループ化します。

    • sparse は、同一の添字をもつ要素を出力に加算します。accumarray は、既定では同一の添字をもつ要素を出力に加算しますが、オプションで任意の関数をビンに適用できます。

この情報は役に立ちましたか?