最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

bsxfun

gpuArray の 2 つの項をシングルトン拡張する関数

説明

メモ

  • 関数 arrayfunbsxfun よりも優れた機能を提供します。arrayfun を推奨します。

  • この関数の動作は MATLAB® 関数 bsxfun と似ていますが、関数の評価が CPU ではなく GPU で行われる点で異なります。まだ GPU 上にない必要なデータは GPU メモリに移動されます。評価のために渡された MATLAB 関数がコンパイルされてから GPU で実行されます。すべての出力引数は gpuArray オブジェクトとして返されます。関数 gather を使用して gpuArray データを取得できます。

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 を使用して、様々な入力の組み合わせについて関数を評価できます。関数 f(a,b) = 1 - ae-b を表す関数ハンドルを作成します。

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

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]).';

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
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
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


+
-
.*
./
.\
.^
==
~=
<
<=
>
>=
&
|
~
&&
||
以下のスカラー拡張バージョン:
*
/
\
^
分岐命令:
break
continue
else
elseif
for
if
return
while

FUN には、乱数発生器関数 randrandi および randn を含めることができます。ただし、GPU では、MATLAB でサポートされている機能のすべてをサポートしているわけではありません。

次の構文は、GPU での乱数行列生成でサポートされています。

rand
rand()
rand('single')
rand('double')
randn
randn()
randn('single')
randn('double')
randi
randi()
randi(IMAX, ...)
randi([IMIN IMAX], ...)
randi(..., 'single')
randi(..., 'double')
randi(..., 'int32')
randi(..., 'uint32')

乱数の生成では、配列サイズは指定しません。代わりに、生成される乱数値の数は関数に対する入力変数のサイズによって決まります。入力変数または出力変数の要求を満たす十分な数の乱数要素が生成されます。乱数配列は、要素ごとに独立したサブストリームを有しています。

GPU での乱数発生の詳細については、GPU 上の乱数ストリームを参照してください。

入力配列。スカラー、ベクトル、行列または多次元配列として指定します。入力 AB は、互換性のあるサイズでなければなりません。詳細については、基本的な演算で互換性のある配列サイズ (MATLAB)を参照してください。A または B の次元がシングルトン (1 と等価) である場合には常に、bsxfun はその次元に沿って配列を実質的に複製し、サイズを他の配列と一致させます。A または B の一方のある次元の大きさが 1 で、もう一方の配列の対応する次元がゼロである場合、bsxfun は実質的に大きさが 1 の次元をゼロに減じます。

少なくとも 1 つの入力が gpuArray でなければなりません。CPU メモリに格納された各配列は、関数が評価される前に gpuArray に変換されます。同じ配列を指定して bsxfun を複数回呼び出す場合、その配列を gpuArray に変換するとより効率的になります。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
複素数のサポート: あり

出力引数

すべて折りたたむ

出力配列。A および B のサイズに応じて、スカラー、ベクトル、行列または多次元配列として返されます。C は gpuArray として返されます。

ヒント

  • GPU で特定の関数を呼び出すために最初に bsxfun を呼び出す時点では、GPU 実行のための関数の設定に若干のオーバーヘッド時間が発生します。同じ関数を指定したその後の bsxfun の呼び出しでは、処理速度が向上します。

  • 入力配列の大きさが 1 でない次元は他の入力配列の大きさが 1 でない次元と一致しなければなりません。つまり、引数 AB などの対応する次元はサイズが互いに等しいか、1 でなければなりません。入力配列の次元がシングルトン (1 と等価) である場合、bsxfun は常にシングルトン拡張を使用します。大きさが 1 の次元に沿って配列を複製し、その次元のサイズを最大の他の配列と一致させます。一方の入力配列の 1 つの次元の大きさが 1 で、もう一方の引数配列の対応する次元がゼロである場合、bsxfun は実質的に大きさが 1 の次元をゼロに減じます。

    出力配列 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 変数はありません。必ずすべての計算結果を明示的に変数に代入します。

  • サポートされていない言語機能として、永続変数またはグローバル変数、parforspmdswitchtry および catch が挙げられます。

  • P コード ファイルに、gpuArray データがある bsxfun の呼び出しを含めることはできません。

R2012a で導入