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Другой пример, где результат — многомерный 3-мерный массив, а значение по умолчанию (ноль) появляется в выводе:
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–2023 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.2.0/Accumulation.html