Spec-Zone.ru › Octave 5

19.2 Вещание

Вещание относится к тому, как бинарные операторы и функции Octave ведут себя, когда их матричные или массивно-векторные операнды или аргументы отличаются по размеру. Начиная с версии 3.6.0, Octave теперь автоматически выполняет вещание векторов, матриц и массивов при использовании элементных бинарных операторов и функций. В общих чертах, меньшие массивы «вещаются» по более крупному, пока не получат совместимую форму. Правило заключается в том, что соответствующие размерности массивов должны либо

  1. быть равными, или
  2. одна из них должна быть равна 1.

В случае, если все размерности равны, вещание не происходит, и выполняется обычное поэлементное арифметическое действие. Для массивов более высоких размерностей, если число размерностей не совпадает, то недостающие конечные размерности обрабатываются как 1. Когда одна из размерностей равна 1, массив с этой размерностью «единицы» копируется вдоль этой размерности до тех пор, пока не будет соответствовать размерности другого массива. Например, рассмотрим

Без вещания x + y было бы ошибкой, потому что размерности не согласованы. Однако с вещанием происходит как будто выполняется следующая операция:

То есть, меньший массив размером [1 3] копируется вдоль размерности «единицы» (число строк) до тех пор, пока он не [3 3]. Однако фактической копирования не происходит. Внутренняя реализация повторно использует элементы вдоль необходимой размерности, чтобы достичь желаемого эффекта без копирования в памяти.

Оба массива могут быть вещаны друг относительно друга, например, все парные разности элементов вектора с самим собой:

Здесь векторы размером [1 3] и [3 1] оба вещаются в матрицы размером [3 3] перед выполнением обычного вычитания матриц.

Особый случай вещания, который может быть знаком, — это когда все размерности массива, который вещается, равны 1, т.е. массив является скаляром. Таким образом, например, операции, такие как x - 42 и max (x, 2), являются простыми примерами вещания.

Для примера более высокой размерности предположим img это изображение RGB размером [m n 3], и мы хотим умножить каждый цвет на разный скаляр. Следующий код выполняет это с помощью вещания,

Обратите внимание на использование permute для соответствия размерностям вектора [0.8, 0.9, 1.2] с img.

Для функций, которые не написаны с учетом семантики вещания, bsxfun может быть полезен для принудительного вещания.

bsxfun (f, A, B)

Применяет бинарную функцию f поэлементно к двум массивно-векторным аргументам A и B, расширяя размерности «единицы» в любом входном аргументе по мере необходимости.

f — это обработчик функции, встроенная функция или строка, содержащая имя функции для вычисления. Функция f должна уметь принимать два аргумента-столбец-векторы одинаковой длины или один аргумент-столбец-вектор и скаляр.

Размерности A и B должны быть равны или иметь размерность «единицы». Размерности «единицы» массивов будут расширены до той же размерности, что и другой массив.

См. также: arrayfun, cellfun.

Вещание применяется только в том случае, если выполняются оба условия вещания. Однако, как обычно, вещание не применяется, когда две размерности различаются, и ни одна из них не равна 1:

Это приведет к ошибке о несогласованных аргументах.

Помимо общих арифметических операций, несколько функций с двумя аргументами также вещаются. Полный список функций и операторов, которые вещаются, — это

Будьте осторожны, прибегая к вещанию, если более простая операция будет достаточной. Для матриц a и b, рассмотрите следующее:

Эта операция вещает две матрицы с переставленными размерностями друг относительно друга во время поэлементного умножения, чтобы получить более крупный массив размерности 3, а затем этот массив суммируется по третьей размерности. Небольшое размышление покажет, что эта операция — просто гораздо более быстрая обычная матричная умножение, c = a*b;.

Примечание по терминологии: «вещание» — это термин, популяризированный численный окружением Numpy в языке программирования Python. В других языках программирования и средах вещание также может быть известно как двоичное расширение «единицы» (BSX, в MATLAB, и отсюда название функции bsxfun), переиспользование (язык программирования R), одна инструкция — множество данных (SIMD) или репликация.

19.2.1 Вещание и код предыдущих версий

Новые семантики вещания практически никогда не влияют на код, который работал в предыдущих версиях Octave. Следовательно, весь код, унаследованный от MATLAB, который работал в предыдущих версиях Octave, должен работать без изменений в Octave. Единственное исключение — код, такой как

который, возможно, полагался на матрицы разных размеров, вызывающие ошибку. Поскольку такая операция теперь является допустимым синтаксисом Octave, это больше не приведет к ошибке. Вместо этого следует использовать следующий код:

© 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/Broadcasting.html

Spec-Zone.ru

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