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 -by 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.

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

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

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

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

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