exponenta event banner

bsxfun

Двоичная функция одноэлементного расширения для gpuArray

Синтаксис

Описание

пример

Примечание

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

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

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

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

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

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

свернуть все

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

Совет

  • При первом звонке bsxfun для выполнения определенной функции на GPU существует некоторое время на создание функции для выполнения GPU. Последующие вызовы 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) и поддерживается доступ к переменным рабочей области родительской (внешней) функции из вложенных функций. Можно проиндексировать переменные, которые существуют в функции до анализа на GPU. Назначение или subsasgn индексирование этих переменных из вложенной функции не поддерживается. Пример поддерживаемого использования см. в разделе Операции с набором элементов графического процессора

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

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

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

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

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

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

См. также

| | |

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