Spec-Zone.ru › Octave 5

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, unique, sparse.

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/v5.2.0/Accumulation.html

Spec-Zone.ru

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