exponenta event banner

accumarray

Накапливать векторные элементы

Описание

пример

B = accumarray(ind,data) суммирует группы данных путем накопления элементов вектора data в соответствии с группами, указанными в ind. Затем вычисляется сумма по каждой группе. Значения в ind определить как группу, к которой принадлежат данные, так и индекс в выходном массиве, B где хранится каждая групповая сумма.

Для возврата групповых сумм по порядку укажите ind как вектор. Затем для группы с индексом i, accumarray возвращает его сумму в B(i). Например, если ind = [1 1 2 2]' и data = [1 2 3 4]', то B = accumarray(ind,data) возвращает вектор столбца B = [3 7]'.

Чтобы вернуть групповые суммы в другой форме, укажите ind в виде матрицы. Для матрицы m-на-n ind, каждая строка представляет групповое назначение и n-мерный индекс на выходе B. Например, если ind содержит две строки формы [3 4], то сумма соответствующих элементов в data хранится в (3,4) элементе B.

Элементы B чей индекс не отображается в ind заполнены 0 по умолчанию.

пример

B = accumarray(ind,data,sz) возвращает массив B дополнено до размера sz. Определить sz как вектор положительных целых чисел, совпадающих или превышающих размерные длины в ind. Дополнительные элементы на выходе заполнены 0. Определить sz как [] для включения индексов ind определите размер выходного сигнала.

пример

B = accumarray(ind,data,sz,fun) применяет функцию fun каждой группе в data указано ind. Определить fun с использованием @ символ, например, @mean, или как [] для использования значения по умолчанию @sum.

пример

B = accumarray(ind,data,sz,fun,fillval) заполняет все элементы B , на которые не ссылается индекс в ind со скалярным значением fillval. Определить fillval как [] для использования значения по умолчанию 0.

пример

B = accumarray(ind,data,sz,fun,fillval,issparse) возвращает массив B разреженный, когда issparse является true или 1, и полный, если issparse является false или 0. Продукция B заполнен по умолчанию.

Примеры

свернуть все

Создание вектора данных и соответствующего вектора ind которая определяет группы.

data = (1:6)'
data = 6×1

     1
     2
     3
     4
     5
     6

ind = [1 3 4 2 4 1]'
ind = 6×1

     1
     3
     4
     2
     4
     1

Суммировать значения в data по группам, указанным в ind.

B = accumarray(ind,data)
B = 4×1

     7
     4
     2
     8

В качестве альтернативы используйте groupsummary функция, указание 'sum' как групповое вычисление.

B = groupsummary(data,ind,'sum')
B = 4×1

     7
     4
     2
     8

Создайте вектор групп.

ind = [1 1 4 2 4 3]';

Применение скалярного расширения к числу 1 для подсчета количества элементов в каждой группе, определенной в ind.

B = accumarray(ind,1)
B = 4×1

     2
     1
     1
     2

В качестве альтернативы используйте groupcounts функция.

B = groupcounts(ind)
B = 4×1

     2
     1
     1
     2

Создание вектора данных и матрицы выходных индексов ind которая определяет группы данных.

data = 1:6
data = 1×6

     1     2     3     4     5     6

ind = [1 1; 2 2; 3 2; 1 1; 2 2; 4 1]
ind = 6×2

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

Суммировать значения в data для каждой группы в ind. Индексы в ind определите матрицу расположений 4 на 2 для вывода.

B1 = accumarray(ind,data)
B1 = 4×2

     5     0
     0     7
     0     3
     6     0

Поместите вывод в матрицу 4 на 4, указав размер вывода как [4 4].

B2 = accumarray(ind,data,[4 4])
B2 = 4×4

     5     0     0     0
     0     7     0     0
     0     3     0     0
     6     0     0     0

Рассчитайте отклонения группы, а не суммы.

Создание вектора данных и матрицы ind которая определяет группы данных.

data = [100.1 101.2 103.4 102.8 100.9 101.5]'
data = 6×1

  100.1000
  101.2000
  103.4000
  102.8000
  100.9000
  101.5000

ind = [1 1; 1 1; 2 2; 3 2; 2 2; 3 2]
ind = 6×2

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

Вычислить дисперсию каждой группы, указав дескриптор функции @var в качестве входных данных метода. Этот синтаксис применяет var функции группам вместо sum.

B1 = accumarray(ind,data,[],@var)
B1 = 3×2

    0.6050         0
         0    3.1250
         0    0.8450

Можно указать групповое вычисление как анонимную функцию, которая принимает векторные входы и возвращает скаляр. Это полезно, когда требуется передать дополнительные аргументы функции. Например, используйте var функция со значением аргумента нормализации 1.

A2 = accumarray(ind,data,[],@(x) var(x,1))
A2 = 3×2

    0.3025         0
         0    1.5625
         0    0.4225

Укажите дополнительный аргумент для sum используя анонимную функцию для ввода метода.

Создание вектора данных и матрицы ind определяет группы индексов данных и 3-D в выходные данные.

data = int8(10:15)
data = 1x6 int8 row vector

   10   11   12   13   14   15

ind = [1 1 1; 1 1 1; 1 1 2; 1 1 2; 2 3 1; 2 3 2]
ind = 6×3

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

Суммирование данных по группам в собственном целочисленном классе int8 с помощью 'native' для опции sum функция. Для этого укажите анонимную функцию с помощью @(x) sum(x,'native') для ввода метода. Результатом является многомерный массив типа 2 на 3 на 2 int8.

B = accumarray(ind,data,[],@(x) sum(x,'native'))
B = 2x3x2 int8 array
B(:,:,1) =

   21    0    0
    0    0   14


B(:,:,2) =

   25    0    0
    0    0   15

Создание вектора данных и матрицы ind которая определяет группы данных.

data = 1:10
data = 1×10

     1     2     3     4     5     6     7     8     9    10

ind = [1 1; 1 1; 1 1; 1 1; 2 1; 2 1; 2 1; 2 1; 2 1; 2 2]
ind = 10×2

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

Группировать элементы data в массив ячеек.

B = accumarray(ind,data,[],@(x) {x})
B=2×2 cell array
    {4x1 double}    {0x0 double}
    {5x1 double}    {[      10]}

Убедитесь, что векторные элементы находятся в том же порядке, что и в data.

B{2,1}
ans = 5×1

     5
     6
     7
     8
     9

Создание вектора данных и матрицы ind которая определяет группы данных.

data = (101:106)'
data = 6×1

   101
   102
   103
   104
   105
   106

ind = [1 1; 2 2; 3 3; 1 1; 2 2; 4 4]
ind = 6×2

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

Элементы ind определите матрицу 4 на 4 для вывода, но только 4 из 16 элементов. По умолчанию остальные 12 элементов 0 в выходных данных. Заполнить дополнительные выходные элементы NaN значения вместо 0.

B = accumarray(ind,data,[],[],NaN)
B = 4×4

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

Создание вектора данных и матрицы ind которая определяет группы данных.

data = [34 22 19 85 53 77 99 6];
ind = [1 1; 400 400; 80 80; 1 1; 400 400; 400 400; 80 80; 1 1]
ind = 8×2

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

Элементы ind определите матрицу 400 на 400 для вывода, но только 3 из 160 000 элементов. При выводе accumarray в результате получается большой массив с низкой плотностью ненулевых элементов, можно сохранить память, указав issparse вариант как true, создание разреженной матрицы вместо полной.

B = accumarray(ind,data,[],[],[],true)
B = 
   (1,1)      125
  (80,80)     118
 (400,400)    152

Входные аргументы

свернуть все

Выходные индексы, заданные как вектор, матрица или клеточный массив векторов.

  • Если ind является вектором, то каждый элемент задает индекс в выходе и определяет группы, накопленные accumarray. Все элементы должны быть положительные целые числа и длина ind должен соответствовать длине вектора данных.

  • Если ind является матрицей m-by-n, затем каждая строка задает n-мерный индекс на выходе. I-й ряд в ind соответствует i-му значению в данных и количеству строк в ind должен соответствовать длине вектора данных. Например, если ind является матрицей 3 на 2, она содержит три 2-D индекса. Первый элемент каждой строки является индексом строки на выходе, а второй элемент - индексом столбца.

  • Если ind - клеточный массив индексных векторов, каждый вектор должен иметь одинаковую длину и обрабатываться как столбцы.

Данные, подлежащие накоплению, указываются как скаляр или вектор.

  • Если data является скаляром, то его значение является скалярным расширенным.

  • Если data является вектором, то он должен иметь ту же длину, что и число строк в индексном массиве.

Размер выходного массива, заданного как вектор положительных целых чисел или как []. Например, sz = [5 7] создает выходной массив 5 на 7. При указании [] для размера значения в индексном массиве определяют размер выходного сигнала. Длины размеров в sz должны совпадать или превышать длины измерений в массиве индекса.

Вычисление группы, указанное как дескриптор функции. accumarray накапливает элементы вектора данных по группам, а затем применяет функцию fun к элементам группы. При указании fun = [], в вычислениях используется функция по умолчанию sum. Указанная функция должна принимать вектор столбца и возвращать числовое значение, logical, или char скаляр или скаляр cell. Дополнительные сведения об дескрипторах функций см. в разделе Создание дескриптора функции.

Пример: fun = @max

Значение заполнения, если элемент вывода не соответствует индексу, предоставленному в индексном массиве, заданному как скаляр или как [], в котором используется значение по умолчанию 0. Тип данных fillval должен соответствовать типу данных вывода вычислительной функции.

Выходная разреженность, заданная как числовая или логическая 1 (true) или 0 (false).

Когда issparse является true или 1, значение заполнения должно быть 0 или [], а входные данные и выходные данные вычислительной функции должны иметь тип double.

Выходные аргументы

свернуть все

Выходной массив, возвращаемый как вектор, матрица или многомерный массив. B имеет тот же тип данных, что и значения, возвращаемые функцией вычисления группы.

Когда размер B не указан, размер вывода зависит от массива индекса ind.

  • Если ind является вектором столбца, то B - вектор столбца длины max(ind,[],1).

  • Если ind является матрицей с несколькими столбцами, то B является многомерным массивом размера max(ind,[],1).

Подробнее

свернуть все

Накапливающие элементы

На следующем рисунке показано поведение accumarray на векторе температурных данных, взятых за 12-месячный период. Чтобы найти максимальное значение температуры для каждого месяца, accumarray применяет max для каждой группы значений в temperature которые имеют идентичные индексы в month.

Нет значений в month указывает на 5, 6, 7 или 10 позиций выходного сигнала. Эти элементы являются 0 в выходных данных по умолчанию.

Совет

  • Поведение accumarray аналогичен функциям groupsummary и groupcounts для вычисления суммарной статистики по группам и подсчета количества элементов в группе соответственно. Дополнительные возможности группирования в MATLAB ® см. в разделе Данные предварительной обработки.

  • Поведение accumarray также аналогичен histcounts функция.

    • histcounts группирует непрерывные значения в диапазон 1-D с использованием ребер ячеек. accumarray группирует данные по n-мерным индексам.

    • histcounts может возвращать только количество ячеек и размещение ячеек. accumarray может применить любую функцию к данным.

    Вы можете имитировать поведение histcounts использование accumarray с data = 1.

  • sparse функция также имеет поведение накопления, аналогичное поведению accumarray.

    • sparse группирует данные с использованием индексов 2-D, тогда как accumarray группирует данные по n-мерным индексам.

    • Для элементов с одинаковыми индексами, sparse применяет sum функция (для double значения) или any функция (для logical значения) и возвращает скалярный результат в выходной матрице. accumarray суммы по умолчанию, но может применить любую функцию к данным.

Расширенные возможности

.
Представлен до R2006a