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) возвращает массив A путем накопления элементов векторного val с помощью индексов subs. Если subs является вектором - столбцом, то каждый элемент задает соответствующий индекс в выводе, который является также вектором - столбцом. Функция accumarray собирает все элементы val, которые имеют идентичные индексы в subs, и хранит их сумму в месте A, соответствующего тому индексу (для индекса i, A(i)=sum(val(subs(:)==i))). Элементы A, индексы которого не появляются в subs, равны 0.

Для m-by-n матричный subs, каждая строка представляет n - размерный индекс в вывод A. ith строка subs соответствует ith элементу в векторном val.

пример

A = accumarray(subs,val,sz) возвращает массив, A, с размером sz. Задайте sz как вектор положительных целых чисел, чтобы задать размер вывода, или как [], чтобы позволить индексам в subs определить размер вывода. Используйте sz, когда subs не ссылается на запаздывание строк, столбцов или размерностей, что требуется присутствовать в выводе.

пример

A = accumarray(subs,val,sz,fun) применяет функциональный fun к каждому подмножеству элементов в val, которые имеют идентичные индексы в subs. Задайте fun с помощью символа @ (e. g., @mean), или как [], чтобы использовать функцию по умолчанию, @sum.

пример

A = accumarray(subs,val,sz,fun,fillval) заполняет все элементы A, которые не упомянуты никаким индексом в subs со скалярным значением, fillval. Входной параметр fillval должен иметь тот же класс как значения, возвращенные fun. Задайте fillval как [], чтобы использовать значение по умолчанию, 0.

пример

A = accumarray(subs,val,sz,fun,fillval,issparse) возвращает массив, A, который разрежен, если скалярным issparse является true или 1, и полный, если issparse является false или 0. Вывод, A, полон по умолчанию.

Примеры

свернуть все

Создайте вектор индексов, subs.

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

     1
     2
     4
     2
     4

Используйте accumarray с val = 1, чтобы считать количество идентичных индексов в subs.

A = accumarray(subs,1)
A = 4×1

     1
     2
     0
     2

Результатом является вектор количеств интервала. Можно получить тот же ответ с histcounts(subs,'BinMethod','integers'). Однако accumarray также может вычислить количества интервала по более высоким размерным сеткам.

Создайте вектор данных, val и вектора нижних значений с той же длиной, subs.

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

     1
     3
     4
     3
     4

Используйте accumarray, чтобы суммировать значения в val, которые имеют идентичные индексы в subs.

A = accumarray(subs,val)
A = 4×1

   101
     0
   206
   208

Результатом является вектор накопленных значений. Поскольку вторые и четвертые элементы subs равны 3, A(3) является суммой вторых и четвертых элементов val, то есть, A(3) = 102 + 104 = 206. Кроме того, A(2) = 0, потому что subs не содержит значение 2. Поскольку 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 = 6×2

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

Индексы в subs задают 4 2 матрица для вывода.

Используйте accumarray, чтобы суммировать значения в val, которые имеют идентичные индексы в subs.

A = accumarray(subs,val)
A = 4×2

   205     0
     0   207
     0   103
   106     0

Результат 4 2 матрица накопленных значений.

Используйте входной параметр sz accumarray, чтобы возвратить матрицу 4 на 4. Можно задать размер с каждой размерностью, равной или больше, чем размер по умолчанию, в этом случае 4 2, но не меньшие.

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

   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 = 6×2

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

Индексы в subs задают 3 2 матрица для вывода.

Используйте входной параметр fun accumarray, чтобы вычислить отклонения в группе данных в val, которые имеют идентичные индексы в subs. Задайте fun как @var.

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

    0.6050         0
         0    3.1250
         0    0.8450

Результат 3 2 матрица значений отклонения.

Также можно задать fun как анонимную функцию, пока он признает, что вектор вводит и возвращает скаляр. Общая ситуация, где это полезно, должна когда это необходимо передать дополнительные параметры функции. В этом случае используйте функцию var с параметром нормализации.

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

    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 = 6×3

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

Индексы в subs задают 2 3 2 многомерными массивами для вывода.

Используйте accumarray, чтобы суммировать значения данных в val, которые имеют идентичные индексы в subs. Можно использовать указатель на функцию, чтобы суммировать значения в их собственном компоненте, int8, целочисленном классе при помощи опции 'native' функции sum.

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

   21    0    0
    0    0   14


A(:,:,2) =

   25    0    0
    0    0   15

Результатом являются 2 3 2 многомерными массивами класса int8.

Создайте вектор данных, 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 = 10×2

     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 = 2x2 cell array
    {4x1 double}    {0x0 double}
    {5x1 double}    {[      10]}

Результатом является массив ячеек 2 на 2.

Проверьте, что векторные элементы находятся в том же порядке, как они появляются в val.

A{2,1}
ans = 5×1

     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.

Сгруппируйте значения в val в массив ячеек путем определения fun = @(x) {x}.

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

  2×3 cell array

    [2×1 double]    [2×1 double]     []
              []              []    [5]

Результатом является 2 3 массив ячеек.

Исследуйте вектор в A{1,2}.

A{1,2}
ans =

     3
     1

Элементы вектора A{1,2} находятся в различном порядке, чем в val. Первый элемент вектора 3 вместо 1. Если индексы в subs не сортируются относительно их линейных индексов, то accumarray не может всегда сохранять порядок данных в val, когда это передает их fun. В необычном случае, что fun требует, чтобы его входные значения были в том же порядке, как они появляются в val, отсортируйте индексы в subs относительно линейных индексов вывода.

В этом случае используйте функцию sortrows с двумя входными параметрами и двумя выходными параметрами, чтобы переупорядочить subs и val одновременно с уважением к линейным индексам вывода.

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

     1
     3

Элементы вектора A{1,2} находятся теперь в отсортированном порядке.

Создайте вектор данных, val и матрицы индексов, subs.

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

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

Индексы в subs задают матрицу 4 на 4 для вывода, но только ссылку 4 из этих 16 элементов. По умолчанию другими 12 элементами является 0 в выводе.

Используйте входной параметр fillval accumarray, чтобы заполнить дополнительные выходные элементы со значениями NaN.

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

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

Результатом является матрица 4 на 4, дополненная значениями NaN.

Создайте вектор данных, 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 = 8×2

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

Индексы в subs задают 400 400 матрица для вывода, но только ссылка 3 из этих 160 000 элементов. Когда результат операции с accumarray приводит к массиву крупносерийного производства с низкой плотностью ненулевых элементов, можно сохранить пространство памяти путем хранения вывода как разреженной матрицы.

Используйте входной параметр issparse accumarray, чтобы возвратить разреженную матрицу.

A = accumarray(subs,val,[],[],[],true)
A = 
   (1,1)      125
  (80,80)     118
 (400,400)    152

Результатом является разреженная матрица. Можно получить тот же ответ с sparse(subs(:,1),subs(:,2),val).

Входные параметры

свернуть все

Нижняя матрица, заданная как вектор индексов, матрица индексов или массив ячеек индексных векторов. Индексы должны быть положительными целыми числами:

  • Значение в каждой строке матрицы m на n, subs, задает n-мерный индекс в вывод, A. Например, если subs 3 2 матрица, он содержит три 2D индекса. subs также может быть вектором - столбцом индексов, в этом случае вывод, A, является также вектором - столбцом.

  • ith строка в subs соответствует ith значению данных в val.

  • Если subs пуст, то ошибки функции accumarray.

Таким образом subs определяет который данные в val сгруппироваться, а также его конечный пункт назначения в выводе. Если subs является массивом ячеек индексных векторов, каждый вектор должен иметь ту же длину, и функция обрабатывает векторы как столбцы нижней матрицы.

Данные, заданные как вектор или скаляр:

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

  • Если val является скаляром, это - расширенный скаляр.

В обоих случаях непосредственное соединение присутствует между индексами в каждой строке subs и значений данных в val.

Типы данных: единственный | удваиваются | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический | char
Поддержка комплексного числа: Да

Размер выходного массива, заданного как вектор положительных целых чисел или [] (значение по умолчанию). Когда вы задаете [] для размера по умолчанию, значения в subs определяют размер выходного массива, A.

Когда вы задаете sz как вектор положительных целых чисел, он должен удовлетворить эти свойства:

  • Если subs является непустой m-by-n матрица со столбцами n > 1, то sz должен иметь элементы n и пройти логический тест all(sz >= max(subs,[],1)).

  • Если subs является непустым вектором - столбцом, то sz должен быть [m 1] где m >= max(subs).

Пример: sz = [3 3]

Функция, заданная как указатель на функцию или [] (значение по умолчанию). Функцией по умолчанию является @sum. Функция fun должна принять вектор - столбец и возвратить числовое, logical, или скаляр char или скалярный cell. Если индексы в subs не сортируются относительно их линейных индексов, fun не должен зависеть от порядка значений в его входных данных. Для получения дополнительной информации об указателях на функцию см. Создание указателя на функцию.

Пример: fun = @max

Типы данных: function_handle

Заполните значение, заданное как скаляр или [] (значение по умолчанию). Значением по умолчанию fillval является 0. Если subs не ссылается на каждый элемент в выводе, accumarray заполняет вывод со значением, заданным fillval. Класс fillval должен совпасть со значениями, возвращенными fun.

Выведите разреженность, заданную как числовой или логический 1 (true) или 0 (false). Задайте true или 1 когда это необходимо выходной массив, чтобы быть разреженными. Если issparse является true или 1:

  • fillval должен быть 0 или [].

  • Значения в val и выходных значениях fun должны оба иметь, вводят double.

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

свернуть все

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

Когда sz не задан, размер A зависит от входного параметра subs:

  • Если subs является непустой матрицей со столбцами n > 1, то A является n - размерный массив размера max(subs,[],1).

  • Если subs является пустой матрицей со столбцами n > 1, то A является n - размерный пустой массив с размером 0-by-0-by-... 0.

  • Если subs является непустым вектором - столбцом, то A является вектором - столбцом длины max(subs,[],1). Длиной A является 0, когда subs пуст.

Больше о

свернуть все

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

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

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

Советы

  • Поведение accumarray подобно той из функции histcounts. Оба данных группы функций в интервалы.

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

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

    Можно подражать поведению histcounts с помощью accumarray с val = 1.

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

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

    • Для элементов с идентичными индексами sparse присваивает сумму тех элементов к выводу. accumarray делает то же самое по умолчанию, но опционально может применить любую функцию к интервалам.

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

Смотрите также

| | |

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

Была ли эта тема полезной?