主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

arrayfun

将函数应用于 GPU 上的数组的每个元素

说明

注意

该函数的行为与 MATLAB® 函数 arrayfun 类似,只是该函数的评估发生在 GPU 上,而不是 CPU 上。任何尚未在 GPU 上的所需数据都将移动到 GPU 内存。传入评估的 MATLAB 函数经过编译,然后在 GPU 上执行。所有输出参量都作为 gpuArray 对象返回。

B = arrayfun(func,A) 将函数 func 应用于 gpuArray A 的每个元素,然后将 func 的输出连接到输出 gpuArray BB 的大小与 AB(i,j,...) = func(A(i,j,...)) 相同。输入参量 func 是 MATLAB 函数的函数句柄,该函数接受一个输入参量并返回一个标量。func 的调用次数与 A 的元素数量相同。

示例

B = arrayfun(func,A1,...,An)func 应用于数组 A1,...,An 的元素,从而 B(i,j,...) = func(A1(i,j,...),...,An(i,j,...))。函数 func 必须接受 n 输入参量并返回一个标量。A1,...,An 的大小必须匹配或兼容

示例

当函数 B1,...,Bm 返回 func 个输出值时,[B1,...,Bm] = arrayfun(func,___) 返回多个输出数组 mfunc 可以返回具有不同数据类型的输出参量,但每次调用 func 时,每个输出的数据类型必须相同。

示例

示例

全部折叠

定义一个函数,cal。函数 cal 对测量数据数组应用增益和偏移校正。当将 gain 因子和 offset 应用于 rawdata 数组的每个元素时,该函数仅执行逐元素操作。

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

创建测量数据数组。

meas = 1:4
meas = 1×4

     1     2     3     4

创建包含增益和偏移数据的数组。

gn   = rand([1 4],"gpuArray")/100 + 0.995
gn =

    0.9958    0.9967    0.9985    1.0032
offs = rand([1 4],"gpuArray")/50  - 0.01
offs =

    0.0063   -0.0045   -0.0081    0.0002

在 GPU 上运行校准函数。该函数在 GPU 上运行,因为输入参量 gnoffs 已经是 GPU 数组,因此存储在 GPU 内存中。函数运行之前,它将输入数组 meas 转换为 gpuArray 对象。

corrected = arrayfun(@cal,meas,gn,offs)
corrected =

    1.0021    1.9889    2.9874    4.0129

在 GPU 上执行少量逐元素操作不太可能加快您的代码速度。有关展示 arrayfun 执行速度如何随输入数组大小变化的示例,请参阅 使用 arrayfun 提高 GPU 上元素级 MATLAB 函数的性能

定义一个函数,将逐元素操作应用于多个输入并返回多个输出。

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

创建 gpuArray 输入数据,并在 GPU 上评估该函数。

s1 = rand(400,"gpuArray");
s2 = rand(400,"gpuArray");
s3 = rand(400,"gpuArray");
[o1,o2] = arrayfun(@myFun,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              

定义一个创建并使用随机数 R 的函数。

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

在 GPU 上运行该函数。由于 G 是一个 4×4 的 gpuArray 对象,arrayfun 应用 myRandfun 函数 16 次,生成 16 个不同的随机标量值,H

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

    1.0557    0.3599    1.5303    0.2745
    0.4268    1.1226    1.5261    1.7068
    0.0302    0.5814    0.2556    0.3902
    1.1210    1.5310    1.3665    0.8487

输入参数

全部折叠

应用于输入数组元素的函数,指定为函数句柄。

  • func 必须返回标量值。

  • 对于每个输出参量,func 每次调用时都必须返回同一类的值。

  • func 必须接受数值或逻辑输入数据。

  • func 必须是用 MATLAB 语言编写的函数的句柄。您不能将 func 指定为 MEX 函数的句柄。

  • 您不能将 func 指定为静态方法或类构造函数方法。

func 可以包含以下内置 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, if
for
return
switch, case, otherwise
while

创建数组的函数(例如 InfNaNonesrandrandirandnzeros)不支持将大小规范作为输入参量。相反,生成的数组的大小由函数输入变量的大小决定。生成足够的数组元素来满足您的输入或输出变量的需求。您可以使用类和 like 语法指定数据类型。以下示例显示了数组创建函数支持的语法:

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

当您使用 randrandirandnfunc 内生成随机数时,每个元素都是从不同的子流生成的。有关在 GPU 上生成随机数的更多信息,请参阅 GPU 上的随机数流

当在 func 中使用 switch, case, otherwise 时,case 表达式仅支持数值和逻辑值。

输入数组,指定为标量、向量、矩阵或多维数组。至少一个输入数组参量必须是 gpuArrayarrayfun 才能在 GPU 上运行。在函数执行之前,存储在 CPU 内存中的每个数组都会转换为 gpuArray。如果您计划使用同一个数组多次调用 arrayfun,则将该数组转换为 gpuArray 会更有效率。

数据类型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

输出参量

全部折叠

输出数组,以 gpuArray 形式返回。

限制

  • A1,...,An 的大小必须匹配或兼容。输出数组 B 的大小取决于 A1,...,An 的大小。有关详细信息,请参阅基本运算的兼容数组大小

  • 由于 arrayfun 支持的操作是严格逐元素的,并且每个元素的计算都是独立于其他元素进行的,因此施加了某些限制:

    • 输入和输出数组不能改变形状或大小。

    • 数组创建函数(例如 rand)不支持大小规范。随机数数组的每个元素都有独立的流。

  • 您无法指定 arrayfun 计算输出数组 B 元素的顺序,也无法依赖它们以任何特定顺序完成。

  • 与 MATLAB 中的 arrayfun 类似,矩阵指数幂、乘法和除法(^*/\)仅执行逐元素计算。

  • 不支持改变输入或输出数组(catreshape 等)的大小或形状的操作。

  • 支持只读索引 (subsref) 和从嵌套函数内部访问父(外部)函数工作区的变量。您可以在 GPU 上进行评估之前索引函数中存在的变量。不支持在嵌套函数内对这些变量进行赋值或 subsasgn 索引。有关支持的用法示例,请参阅 GPU 上的模板操作

  • 匿名函数无权访问其父函数工作区。

  • 不允许重载支持的函数。

  • 代码无法调用脚本。

  • 没有 ans 变量来保存未分配的计算结果。确保将所有计算的结果明确分配给变量。

  • 不支持以下语言功能:持久变量或全局变量、parforspmdtry/catch

提示

  • 第一次调用 arrayfun 在 GPU 上运行特定函数时,需要一些额外时间来设置该函数以供 GPU 执行。后续使用相同函数调用 arrayfun 可以运行得更快。

扩展功能

全部展开

版本历史记录

在 R2010b 中推出

全部展开