主要内容

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

bsxfun

gpuArray 的二进制单例扩展函数

说明

注意

  • 函数 arrayfunbsxfun 相比,提供了改进的功能。建议使用 arrayfun

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

C = bsxfun(FUN,A,B)FUN 指定的逐元素二元运算应用于数组 AB,并启用单例扩展。

示例

示例

全部折叠

使用 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 将函数应用于向量 abbsxfun 使用单例扩展将向量扩展为矩阵,并使用输入变量的所有排列来评估函数。

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 函数的句柄。

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 表达式仅支持数值和逻辑值。

输入数组,指定为标量、向量、矩阵或多维数组。输入 AB 必须具有兼容的大小。有关详细信息,请参阅基本运算的兼容数组大小。每当 AB 的维度为单例(等于一)时,bsxfun 就会沿该维度虚拟复制数组以匹配另一个数组。如果 AB 的维度为单例,且另一个数组中的对应维度为零,则 bsxfun 实际上会将单例维度减小为零。

至少一个输入必须是 gpuArray。在执行该函数之前,存储在 CPU 内存中的每个数组都会转换为 gpuArray。如果您计划使用同一个数组多次调用 bsxfun,则将该数组转换为 gpuArray 会更有效率。

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

输出参量

全部折叠

输出数组,以标量、向量、矩阵或多维数组的形式返回,具体取决于 AB 的大小。C 以 gpuArray 的形式返回。

提示

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

  • 输入数组的非单一维度必须彼此匹配。换句话说,参量 AB 等的对应维度必须彼此相等,或者等于一。每当输入数组的维度为单例(等于 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 等函数不支持大小规范。随机数数组的每个元素都有独立的流。

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

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

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

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

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

  • 代码无法调用脚本。

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

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

  • P 代码文件不能包含对带有 gpuArray 数据的 bsxfun 的调用。

版本历史记录

在 R2012a 中推出

另请参阅

| | |