bsxfun

Бинарное одноэлементное расширение функционирует для gpuArray

Синтаксис

C = bsxfun(FUN,A,B)

Описание

пример

Примечание

  • Функциональный arrayfun предлагает улучшенную функциональность по сравнению с bsxfun. arrayfun рекомендуется.

  • Эта функция ведет себя так же к функции MATLAB® bsxfun, за исключением того, что оценка функции происходит на графическом процессоре, не на центральном процессоре. Любые необходимые данные не уже на графическом процессоре перемещены в память графического процессора. Функция MATLAB передала в для оценки, скомпилирован и затем выполнен на графическом процессоре. Все выходные аргументы возвращены как gpuArray объекты. Можно получить gpuArray данные с помощью функции gather.

C = bsxfun(FUN,A,B) применяет поэлементно бинарную операцию, заданную FUN к массивам A и B, с одноэлементным включенным расширением.

Примеры

свернуть все

Используйте bsxfun с матрицей, чтобы вычесть среднее значение каждого столбца от всех элементов в том столбце. Затем нормализуйте стандартным отклонением каждого столбца.

A = rand(4,'gpuArray');
B = bsxfun(@minus,A,mean(A));
C = bsxfun(@rdivide,B,std(B))

Можно использовать bsxfun, чтобы выполнить функцию для различных комбинаций входных параметров. Создайте указатель на функцию, который представляет функциональный f (a, b) = 1 - a e-b

A = rand(4,'gpuArray');
B = bsxfun(@minus,A,mean(A));
C = bsxfun(@rdivide,B,std(B))
C =

   -1.2957   -1.1587   -0.8727    0.2132
   -0.2071    0.9960    0.3272   -1.2763
    0.4786    0.6523   -0.7228    1.1482
    1.0243   -0.4896    1.2684   -0.0851

Используйте bsxfun, чтобы применить функции к векторам a и b. bsxfun использует одноэлементное расширение, чтобы расширить векторы в матрицы и выполняет функцию со всеми перестановками входных переменных.

a = gpuArray(1:7)
b = gpuArray(pi*[0 1/4 1/2 3/4 1 5/4 6/4 7/4 2]).';

c = bsxfun(fun, a,b)
c =

         0   -1.0000   -2.0000   -3.0000   -4.0000   -5.0000   -6.0000
    0.5441    0.0881   -0.3678   -0.8238   -1.2797   -1.7356   -2.1916
    0.7921    0.5842    0.3764    0.1685   -0.0394   -0.2473   -0.4552
    0.9052    0.8104    0.7157    0.6209    0.5261    0.4313    0.3365
    0.9568    0.9136    0.8704    0.8271    0.7839    0.7407    0.6975
    0.9803    0.9606    0.9409    0.9212    0.9015    0.8818    0.8621
    0.9910    0.9820    0.9731    0.9641    0.9551    0.9461    0.9371
    0.9959    0.9918    0.9877    0.9836    0.9795    0.9754    0.9713
    0.9981    0.9963    0.9944    0.9925    0.9907    0.9888    0.9869

Входные параметры

свернуть все

Функция, чтобы примениться к элементам входных массивов, заданных как указатель на функцию. FUN должен быть указателем на поддерживаемую поэлементную функцию или поэлементную функцию, написанную в языке MATLAB, который использует поддерживаемые функции и синтаксис. Fun должен возвратить скалярные значения. Для каждого выходного аргумента FUN должен возвращаемые значения того же класса каждый раз, когда это называется.

FUN должен быть указателем на функцию, которая написана в языке MATLAB. Вы не можете задать FUN как указатель на MEX-функцию.

FUN может содержать следующие встроенные функции MATLAB и операторы.

abs
and
acos
acosh
acot
acoth
acsc
acsch
asec
asech
asin
asinh
atan
atan2
atanh
beta
betaln
bitand
bitcmp
bitget
bitor
bitset
bitshift
bitxor
ceil
complex
conj
cos
cosh
cot
coth
csc
csch
double
eps
eq
erf
erfc
erfcinv
erfcx
erfinv
exp
expm1
false
fix
floor
gamma
gammaln
ge
gt
hypot
imag
Inf
int8
int16
int32
int64
intmax
intmin
isfinite
isinf
isnan
ldivide
le
log
log2
log10
log1p
logical
lt
max
min
minus
mod
NaN
ne
not
or
pi
plus
pow2
power
rand
randi
randn
rdivide
real
reallog
realmax
realmin
realpow
realsqrt
rem
round
sec
sech
sign
sin
single
sinh
sqrt
tan
tanh
times
true
uint8
uint16
uint32
uint64
xor


+
-
.*
./
.\
.^
==
~=
<
<=
>
>=
&
|
~
&&
||
Скалярные версии расширения следующего:
*
/
\
^
Команды ветвления:
break
continue
else
elseif
for
if
return
while

FUN может содержать функции генератора случайных чисел rand, randi и randn. Однако графический процессор не поддерживает полную функциональность, которую делает MATLAB.

Следующие синтаксисы поддерживаются для случайной генерации матрицы на графическом процессоре.

rand
rand()
rand('single')
rand('double')
randn
randn()
randn('single')
randn('double')
randi
randi()
randi(IMAX, ...)
randi([IMIN IMAX], ...)
randi(..., 'single')
randi(..., 'double')
randi(..., 'int32')
randi(..., 'uint32')

Вы не задаете размер массивов для случайной генерации. Вместо этого количество сгенерированных случайных значений определяется размерами входных переменных к вашей функции. Достаточно элементов случайных чисел сгенерировано, чтобы удовлетворить потребности ваших переменных ввода или вывода. Массивы случайных чисел имеют независимые подпотоки для каждого элемента.

Для получения дополнительной информации о генерации случайных чисел на графическом процессоре, смотрите Потоки Случайных чисел на графическом процессоре.

Входные массивы, заданные как скаляры, векторы, матрицы или многомерные массивы. Входные параметры A и B должны иметь совместимые размеры. Для получения дополнительной информации смотрите Совместимые Размеры Массивов для Основных Операций (MATLAB). Каждый раз, когда размерность A или B является одиночным элементом (равный одному), bsxfun фактически реплицирует массив по тому измерению, чтобы совпадать с другим массивом. В случае, где размерность A или B является одиночным элементом, и соответствующая размерность в другом массиве является нулем, bsxfun фактически уменьшает одноэлементную размерность, чтобы обнулить.

По крайней мере одни из входных параметров должны быть gpuArray. Каждый массив, который хранится на памяти ЦП, преобразован в gpuArray, прежде чем функция будет выполнена. Если вы планируете выполнить несколько вызовов к bsxfun с тем же массивом, более эффективно преобразовать тот массив в gpuArray.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | логический
Поддержка комплексного числа: Да

Выходные аргументы

свернуть все

Выходной массив, возвращенный как скаляр, вектор, матрица или многомерный массив, в зависимости от размеров A и B. C возвращен как gpuArray.

Советы

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

  • Неодноэлементные размерности входных массивов должны совпадать друг с другом. Другими словами, соответствующие размерности аргументов A, B, и т.д., должны быть равны друг другу или равны одному. Каждый раз, когда размерность входного массива является одиночным элементом (равный 1), bsxfun использует одноэлементное расширение. Массив реплицирован по одноэлементному измерению, чтобы совпадать с самым большим из других массивов в той размерности. Когда размерность входного массива является одиночным элементом, и соответствующая размерность в другом массиве аргументов является нулем, bsxfun фактически уменьшает одноэлементную размерность к 0.

    Каждая размерность выходного массива C одного размера как самый большой из входных массивов в той размерности для ненулевого размера или нуль в противном случае. Следующий код показывает, как размерности размера 1 увеличены или вниз совпадать с размером соответствующей размерности в других аргументах.

    R1 = rand(2,5,4,'gpuArray');
    R2 = rand(2,1,4,3,'gpuArray');
    R = bsxfun(@plus,R1,R2);
    size(R)
    
      2     5     4     3
    R1 = rand(2,2,0,4,'gpuArray');
    R2 = rand(2,1,1,4,'gpuArray');
    R = bsxfun(@plus,R1,R2);
    size(R)
    
      2     2     0     4
    
  • Поскольку операции, поддержанные bsxfun, строго поэлементны, и каждое вычисление каждого элемента выполняется независимо от других, определенные ограничения вводятся:

    • Массивы ввода и вывода не могут изменить форму или размер.

    • Функции, такие как rand, не поддерживают спецификации размера. Массивы случайных чисел имеют независимые потоки для каждого элемента.

  • Как bsxfun в MATLAB, матричная экспоненциальная степень, умножение и деление (^, *, /, \) выполняют поэлементные вычисления только.

  • Операции, которые изменяют размер или форму массивов ввода или вывода (cat, reshape, и так далее), не поддержаны.

  • Индексация только для чтения (subsref) и доступ к переменным родительской (внешней) функциональной рабочей области из вложенных функций поддерживается. Можно индексировать переменные, которые существуют в функции перед оценкой на графическом процессоре. Индексация присвоения или subsasgn этих переменных из вложенной функции не поддержана. Для примера поддерживаемого использования смотрите Операции Шаблона на графическом процессоре

  • Анонимные функции не имеют доступа к своей родительской функциональной рабочей области.

  • Перегрузка поддерживаемых функций не позволена.

  • Код не может вызвать скрипты.

  • Нет никакой переменной ans, чтобы содержать неприсвоенные результаты вычисления. Убедитесь, что явным образом присвоили переменным результаты всех вычислений.

  • Следующие функции языка не поддерживаются: персистентные или глобальные переменные, parfor, spmd, switch и try/catch.

  • Pcode-файлы не могут содержать вызов bsxfun с gpuArray данными.

Смотрите также

| | |

Представленный в R2012a