Spec-Zone.ru › Octave 6

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/v6.4.0/Accumulation.html

Spec-Zone.ru

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