Spec-Zone.ru › Octave 9

Next: Запоминание, Previous: Применение функций, Up: Векторизация и ускорение выполнения кода [Оглавление][Индекс]

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 и вычислить результаты векторизованным способом.

См. также: accumdim, unique, sparse.

: 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.

Next: Запоминание, Previous: Применение функций, Up: Векторизация и ускорение выполнения кода [Оглавление][Индекс]

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API