19.4 Накопление
В тех случаях, когда при вычислении можно категоризировать элементы массива по индексам, функции накопления могут быть полезны.
- : accumarray (subs, vals, sz, func, fillval, issparse)
- : accumarray (subs, vals, …)
Создает массив путем накопления элементов вектора в позиции, определенные их индексами.
Индексы определяются строками матрицы subs, а значения – vals. Каждая строка subs соответствует одному из значений в vals. Если vals является скаляром, он будет использоваться для каждой строки subs. Если subs является массивом ячеек векторов, все векторы должны иметь одинаковую длину, а индексы в k-ом векторе должны соответствовать k-ой размерности результата.
Размер матрицы будет определяться самими индексами. Однако, если определен sz, он определяет размер матрицы. Длина sz должна соответствовать количеству столбцов в subs. Исключением является случай, когда subs имеет только один столбец, в этом случае sz может быть размерами вектора, и индексы subs используются как индексы в нем.
По умолчанию
accumarrayсуммирует элементы с одинаковыми индексами. Это поведение можно изменить, определив функцию func. Она должна быть функцией или дескриптором функции, которая принимает столбец вектора и возвращает скаляр. Результат функции не должен зависеть от порядка индексов.Элементы возвращаемого массива, для которых нет связанных с ними индексов, устанавливаются в ноль. Определение fillval для другого значения позволяет определить эти значения. Однако это поведение меняется для определенных значений func. Если func является
@min(соответственно,@max), результат будет заполнен минимальным (соответственно, максимальным) целым числом, если vals имеет целочисленный тип, логическим false (соответственно, логическим true), если vals имеет логический тип, нулем, если fillval равен нулю и все значения неположительны (соответственно, неположительны), и NaN в противном случае.По умолчанию
accumarrayвозвращает полную матрицу. Если issparse логически истинно, возвращается разреженная матрица.Следующий
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Еще один пример, где результатом является многомерный 3D массив, а значение по умолчанию (ноль) появляется в выводе:
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 – максимальный индекс (линейный в многомерном случае). Если func – одна из функций
@sum(по умолчанию),@max,@minили@(x) {x}, используется оптимизированный путь кода. Обратите внимание, что для общих функций сокращения интерпретатор может играть большую роль, и может быть эффективнее выполнить несколько вызовов accumarray и вычислить результаты векторным способом.
- : accumdim (subs, vals, dim, n, func, fillval)
Создает массив путем накопления срезов массива в позиции, определенные их индексами вдоль заданной размерности.
Индексы определяются индексным вектором subs. Размерность задается dim. Если не задана, по умолчанию используется первая неединичная размерность. Длина subs должна быть равна
size (vals, dim).Размерность результата в рабочей размерности определяется самими индексами. Однако, если определен n, он определяет эту размерность.
По умолчанию
accumdimсуммирует подмассивы с одинаковыми индексами. Это поведение можно изменить, определив функцию func. Она должна быть функцией или дескриптором функции, которая принимает массив и размерность, и сводит массив вдоль этой размерности. В качестве специального исключения, встроенные функции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–2022 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/v6.4.0/Accumulation.html