Spec-Zone.ru › Octave 6

19.2 Вещание

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

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

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

%%%CODE_BLOCK_0%%>

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

%%%CODE_BLOCK_2%%>

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

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

%%%CODE_BLOCK_5%%>

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

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

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

%%%CODE_BLOCK_13%%>

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

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

: bsxfun (f, A, B)

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

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

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

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

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

%%%CODE_BLOCK_17%%>

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

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

%%%CODE_BLOCK_18%%>

Следует избегать использования вещания, если существует более простое решение. Для матриц a и b рассмотрим следующее:

%%%CODE_BLOCK_19%%>

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

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

19.2.1 Вещание и устаревший код

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

%%%CODE_BLOCK_22%%>

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

%%%CODE_BLOCK_23%%>

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

Spec-Zone.ru

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