Spec-Zone.ru › Octave 8

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 логически истинно, возвращается разреженная матрица.

Следующий 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.

© 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/v8.1.0/Accumulation.html

Spec-Zone.ru

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