bsxfun

Двоичная функция расширения singleton для gpuArray

Синтаксис

Описание

пример

Примечание

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

  • Эта функция ведет себя аналогично MATLAB® функция bsxfun, за исключением того, что оценка функции происходит на графическом процессоре, а не на центральном процессоре. Все необходимые данные, еще не установленные на графическом процессоре, перемещаются в память GPU. Функция 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 для вычисления функции для различных комбинаций входов.

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

Создайте указатель на функцию, который представляет f на функцию (a, b) = 1 - a e-b. Использование 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]).';
fun = @(a,b) 1 - a.*exp(-b);
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
cast
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
ones
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
zeros

+
-
.*
./
.\
.^
==
~=
<
<=
>
>=
&
|
~
&&
||

Скалярные версии расширения:

*
/
\
^
Инструкции по разветвлению:
break
continue
else
elseif
for
if
return
while

Функции, которые создают массивы (такие как Inf, NaN, ones, rand, randi, randn, и zeros) не поддерживает спецификации размера в качестве входных параметров. Вместо этого размер сгенерированного массива определяется размером входных переменных в ваши функции. Достаточно элементов массива сгенерированы, чтобы удовлетворить потребности ваших входных или выходных переменных. Тип данных можно задать, используя как класс, так и "like" синтаксисы. В следующих примерах показаны поддерживаемые синтаксисы для функций создания массивов:

a = rand;
b = ones();
c = zeros("like", x);
d = Inf("single");
e = randi([0 9], "uint32");

Когда вы используете rand, randi, и randn чтобы сгенерировать случайные числа в FUNкаждый элемент генерируется из другого субпотока. Для получения дополнительной информации о генерации случайных чисел на графическом процессоре, смотрите Потоки случайных чисел на графическом процессоре.

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

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

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

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

свернуть все

Выходной массив, возвращенный в виде скаляра, вектора, матрицы или многомерного массива, в зависимости от размеров 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 индексация этих переменных из вложенной функции не поддерживается. Пример поддерживаемого использования см. в разделе Операции Stencil на графическом процессоре

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

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

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

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

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

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

См. также

| | |

Введенный в R2012a