Spec-Zone.ru › Octave 7

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 логически равно 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 — максимальный индекс (линейно в многомерном случае). Если 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/v7.2.0/Accumulation.html

Spec-Zone.ru

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