Примените функцию к каждому элементу массива на графическом процессоре
B = arrayfun(FUN,A)
B = arrayfun(FUN,A1,...,An)
[B1,...,Bm] = arrayfun(FUN,___)
Эта функция ведет себя так же к функции MATLAB® arrayfun
, за исключением того, что оценка функции происходит на графическом процессоре, не на центральном процессоре. Любые необходимые данные не уже на графическом процессоре перемещены в память графического процессора. Функция MATLAB передала в для оценки, скомпилирован и затем выполнен на графическом процессоре. Все выходные аргументы возвращены как gpuArray объекты. Можно получить gpuArray данные с помощью функции gather
.
применяет функциональный B
= arrayfun(FUN
,A
)FUN
к каждому элементу gpuArray A
. arrayfun
затем конкатенирует выходные параметры от FUN
в выходной gpuArray B
. B
одного размера как 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
. Если вы вызываете arrayfun
с большим количеством выходных аргументов, чем поддерживаемый FUN
, MATLAB генерирует ошибку. FUN
может возвратить выходные аргументы, имеющие различные типы данных, но тип данных каждого вывода должен быть тем же каждым разом, когда FUN
называется.
В первый раз вы вызываете arrayfun
, чтобы запустить конкретную функцию на графическом процессоре, существует некоторое служебное время, чтобы настроить функцию для выполнения графического процессора. Последующие вызовы arrayfun
с той же функцией могут запуститься быстрее.
Неодноэлементные размерности входных массивов должны совпадать друг с другом. Другими словами, соответствующие размерности аргументов A1,...,An
, должны быть равны друг другу или равны одному. Каждый раз, когда размерность входного массива является одиночным элементом (равный 1
), arrayfun
использует одноэлементное расширение. Массив фактически реплицирован по одноэлементному измерению, чтобы совпадать с самым большим из других массивов в той размерности. Когда размерность входного массива является одиночным элементом, и соответствующая размерность в другом массиве аргументов является нулем, 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
, reshape
, и так далее), не поддержаны.
Индексация только для чтения (subsref
) и доступ к переменным родительской (внешней) функциональной рабочей области из вложенных функций поддерживается. Можно индексировать переменные, которые существуют в функции перед оценкой на графическом процессоре. Индексация присвоения или subsasgn
этих переменных из вложенной функции не поддержана. Для примера поддерживаемого использования смотрите Операции Шаблона на графическом процессоре
Анонимные функции не имеют доступа к своей родительской функциональной рабочей области.
Перегрузка поддерживаемых функций не позволена.
Код не может вызвать скрипты.
Нет никакой переменной ans
, чтобы содержать неприсвоенные результаты вычисления. Убедитесь, что явным образом присвоили переменным результаты всех вычислений.
Следующие функции языка не поддерживаются: персистентные или глобальные переменные, parfor
, spmd
, switch
и try
/catch
.
Pcode-файлы не могут содержать вызов arrayfun
с gpuArray данными.