arrayfun

Примените функцию к каждому элементу массива на графическом процессоре

Описание

пример

Примечание

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

B = arrayfun(FUN,A) применяет функциональный FUN к каждому элементу gpuArray Aarrayfun затем конкатенирует выходные параметры от FUN в выходной gpuArray BB одного размера с A и B(i,j,...) = FUN(A(i,j,...)). Входной параметр FUN указатель на функцию к функции MATLAB, которая берет один входной параметр и возвращает скалярное значение. FUN называется так же много раз, как существуют элементы A.

Вы не можете задать порядок в который arrayfun вычисляет элементы B или используйте то, чтобы они были сделанным в каком-то конкретном порядке.

пример

B = arrayfun(FUN,A1,...,An) применяет FUN к элементам массивов A1,...,An, так, чтобы B(i,j,...) = FUN(A1(i,j,...),...,An(i,j,...)). Функциональный FUN должен взять n входные параметры и возвращают скаляр. Неодноэлементные размерности входных параметров A1,...,An должен все соответствовать, или входные параметры должны быть скаляром. Любые одноэлементные размерности или скалярные входные параметры фактически реплицированы прежде чем быть введенным в функциональный FUN.

пример

[B1,...,Bm] = arrayfun(FUN,___) возвращает несколько выходных массивов B1,...,Bm когда функциональный FUN возвращает m выходные значения. arrayfun вызовы FUN каждый раз со столькими же выходных параметров, сколько существует в вызове arrayfun, то есть, m \times. Если вы вызываете arrayfun с большим количеством выходных аргументов, чем поддерживаемый FUN, MATLAB генерирует ошибку. FUN может возвратить выходные аргументы, имеющие различные типы данных, но тип данных каждого выхода должен быть тем же каждым разом FUN называется.

Примеры

свернуть все

В этом примере небольшая функция применяет данные о коррекции к массиву данных об измерении. Функция, определяемая в файле myCal.m показан здесь.

function c = myCal(rawdata, gain, offset)
    c = (rawdata .* gain) + offset;
end

Функция выполняет только поэлементные операции при применении фактора усиления и смещения к каждому элементу rawdata массив.

Создайте номинальное измерение.

meas = ones(1000)*3; % 1000-by-1000 matrix

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

gn   = rand(1000,"gpuArray")/100 + 0.995; 
offs = rand(1000,"gpuArray")/50  - 0.01;

Запустите свою калибровочную функцию на графическом процессоре.

corrected = arrayfun(@myCal,meas,gn,offs);

Функция работает на графическом процессоре потому что входные параметры gn и offs уже находятся в памяти графического процессора. Входной массив meas преобразован в gpuArray перед функциональными запусками.

Получите откорректированные результаты графического процессора к рабочему пространству MATLAB.

results = gather(corrected);

Можно задать функцию MATLAB можно следующим образом.

function [o1,o2] = aGpuFunction(a,b,c)
    o1 = a + b;
    o2 = o1 .* c + 2;
end

Выполните эту функцию на графическом процессоре.

s1 = rand(400,"gpuArray");
s2 = rand(400,"gpuArray");
s3 = rand(400,"gpuArray");
[o1,o2] = arrayfun(@aGpuFunction,s1,s2,s3);
whos
  Name        Size               Bytes  Class       Attributes

  o1        400x400            1280000  gpuArray              
  o2        400x400            1280000  gpuArray              
  s1        400x400            1280000  gpuArray              
  s2        400x400            1280000  gpuArray              
  s3        400x400            1280000  gpuArray              

Используйте gather получать данные от графического процессора до рабочего пространства MATLAB.

d = gather(o2);

Функциональный myfun.m генерирует и использует случайное число R.

function Y = myfun(X)
    R = rand();
    Y = R.*X;
end

Если вы используете arrayfun чтобы запустить эту функцию с входной переменной, которая является gpuArray, функция работает на графическом процессоре. Размер X определяет количество случайных элементов, чтобы сгенерировать. Следующий код передает gpuArray матричный G к myfun на графическом процессоре.

G = 2*ones(4,4,"gpuArray")
H = arrayfun(@myfun, G)

Поскольку G gpuArray 4 на 4, myfun генерирует 16 случайных скалярных элементов значения для R, один для каждого вычисления с элементом G.

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

свернуть все

Функция, чтобы примениться к элементам входных массивов в виде указателя на функцию. FUN должен возвратить скалярные значения. Для каждого выходного аргумента, 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

Функции, которые создают массивы (такие как InfNaNединицыrandrandirandn, и zeros) не поддерживайте спецификации размера как входные параметры. Вместо этого размер сгенерированного массива определяется размером входных переменных к вашим функциям. Достаточно элементов массива сгенерировано, чтобы удовлетворить потребностям ваших переменных ввода или вывода. Можно задать тип данных с помощью и класса и "like" синтаксисы. Следующие примеры показывают поддерживаемые синтаксисы для функций создания массивов:

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

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

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

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

свернуть все

Выходной массив, возвращенный как gpuArray.

Советы

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

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

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

    R1 = rand(2,5,4,"gpuArray");
    R2 = rand(2,1,4,3,"gpuArray");
    R3 = rand(1,5,4,3,"gpuArray");
    R = arrayfun(@(x,y,z)(x+y.*z),R1,R2,R3);
    size(R)
    
      2     5     4     3
    R1 = rand(2,2,0,4,"gpuArray");
    R2 = rand(2,1,1,4,"gpuArray");
    R = arrayfun(@plus,R1,R2);
    size(R)
    
      2     2     0     4
    
  • Поскольку операции поддержаны arrayfun строго поэлементны, и каждый расчет каждого элемента выполняется независимо от других, определенные ограничения вводятся:

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

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

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

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

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

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

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

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

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

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

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

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