19.4 Накопление
Функции накопления могут быть полезны, когда при выполнении вычислений элементы массива можно классифицировать по индексам.
-
:
A =accumarray(subs, vals) -
:
A =accumarray(subs, vals, sz) -
:
A =accumarray(subs, vals, sz, fcn) -
:
A =accumarray(subs, vals, sz, fcn, fillval) -
:
A =accumarray(subs, vals, sz, fcn, fillval, issparse) -
Создает массив, накапливая элементы вектора в позициях, заданных их индексами.
Индексы задаются строками матрицы subs, а значения — vals. Каждая строка subs соответствует одному из значений vals. Если vals — скаляр, он будет использоваться для каждой строки subs. Если subs — массив ячеек с векторами, все векторы должны иметь одинаковую длину, а индексы в k-м векторе должны соответствовать k-му измерению результата.
Размер матрицы определяется самими индексами. Однако, если задан sz, он определяет размер матрицы. Длина sz должна соответствовать числу столбцов в subs. Исключение составляют случаи, когда subs имеет только один столбец: тогда sz может задавать размеры вектора, а индексы из subs считаются индексами его элементов.
По умолчанию
accumarrayсуммирует элементы с одинаковыми индексами. Это поведение можно изменить, задав функцию fcn. Это должна быть функция или дескриптор функции, принимающая вектор-столбец и возвращающая скаляр. Результат функции не должен зависеть от порядка индексов.Элементы возвращаемого массива, которым не соответствуют индексы, устанавливаются в ноль. Задав для fillval другое значение, можно определить эти значения. Однако это поведение меняется для некоторых значений fcn. Если fcn —
@min(соответственно,@max), то результат будет заполнен минимальным (соответственно, максимальным) целым числом, если vals имеет целочисленный тип; логическим значением false (соответственно, логическим значением true), если vals имеет логический тип; нулем, если fillval равен нулю и все значения неположительны (соответственно, неотрицательны); в противном случае — NaN.По умолчанию
accumarrayвозвращает полную матрицу. Если issparse имеет логическое значение true, вместо нее возвращается разреженная матрица.В следующем примере
accumarrayсоздается таблица частот: в первом столбце подсчитывается, сколько раз каждое число из второго столбца встречается в векторе x. Обратите внимание на использованиеuniqueдля присвоения одинакового индекса всем повторяющимся элементам x (см.unique).x = [91, 92, 90, 92, 90, 89, 91, 89, 90, 100, 100, 100]; [u, ~, j] = unique (x); [accumarray(j', 1), u'] ⇒ 2 89 3 90 2 91 2 92 3 100Еще один пример: результатом является многомерный трехмерный массив, в выводе которого отображается значение по умолчанию (ноль):
accumarray ([1, 1, 1; 2, 1, 2; 2, 3, 2; 2, 1, 2; 2, 3, 2], 101:105) ⇒ ans(:,:,1) = [101, 0, 0; 0, 0, 0] ⇒ ans(:,:,2) = [0, 0, 0; 206, 0, 208]Параметр разреженности можно использовать как альтернативу конструктору
sparse(см.sparse). Таким образом,sparse (i, j, sv)
можно записать с помощью
accumarrayследующим образом:accumarray ([i, j], sv', [], [], 0, true)
Для повторяющихся индексов
sparseскладывает соответствующие значения. Чтобы вместо этого найти минимум, используйтеminв качестве функции-накопителя:accumarray ([i, j], sv', [], @min, 0, true)
В общем случае сложность accumarray для несжатого представления составляет O(M+N), где N — число индексов, а M — максимальный индекс (в многомерном случае — линеаризованный). Если fcn — одна из функций
@sum(по умолчанию),@max,@minили@(x) {x}, используется оптимизированный путь выполнения. Обратите внимание: при использовании произвольной функции редукции значительную роль могут играть накладные расходы интерпретатора, поэтому может быть эффективнее выполнить несколько вызовов accumarray и вычислить результаты в векторизованном виде.
-
:
A =accumdim(subs, vals) -
:
A =accumdim(subs, vals, dim) -
:
A =accumdim(subs, vals, dim, n) -
:
A =accumdim(subs, vals, dim, n, fcn) -
:
A =accumdim(subs, vals, dim, n, fcn, fillval) -
Создает массив, накапливая срезы массива в позициях, заданных их индексами вдоль указанного измерения.
Индексы задаются индексным вектором subs. Измерение указывается параметром dim. Если он не задан, по умолчанию используется первое измерение, размер которого не равен единице. Длина subs должна быть равна
size (vals, dim).Размер результирующей матрицы вдоль обрабатываемого измерения определяется самими индексами. Однако, если задан n, он определяет этот размер.
По умолчанию
accumdimсуммирует подмассивы с одинаковыми индексами. Это поведение можно изменить, задав функцию fcn. Это должна быть функция или дескриптор функции, принимающая массив и измерение и выполняющая редукцию массива вдоль этого измерения. В качестве особого исключения встроенные функцииminиmaxможно использовать напрямую, аaccumdimучитывает пустой аргумент, расположенный между ними в вызове.Срезы возвращаемого массива, которым не соответствуют индексы, устанавливаются в ноль. Задав для fillval другое значение, можно определить эти значения.
Пример использования
accumdim:accumdim ([1, 2, 1, 2, 1], [ 7, -10, 4; -5, -12, 8; -12, 2, 8; -10, 9, -3; -5, -3, -13]) ⇒ [-10,-11,-1;-15,-3,5]См. также: accumarray.
© 1996–2026 The Octave Project Developers
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions.
https://docs.octave.org/v9.4.0/Accumulation.html