accumarray

Создайте массив с накоплением

Описание

пример

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

Для m- 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 использование @ символ (например, @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=2×2 cell
    {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-by-n матрица, subs, задает n - размерный индекс в выход, A. Например, если subs 3-на-2 матрица, она содержит три 2D индекса. subs также может быть вектор-столбец индексов, в этом случае выход, A, также вектор-столбец.

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

  • Если subs пусто, затем accumarray функциональные ошибки.

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

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

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

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

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char
Поддержка комплексного числа: Да

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

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

  • Если subs непустой m- 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 ложь). Задайте 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 isempty.

Больше о

свернуть все

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

Следующая диаграмма иллюстрирует поведение 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

Для просмотра документации необходимо авторизоваться на сайте