私が使用する理由は 3 つありますbsxfun
(ドキュメント、ブログ リンク)
bsxfun
よりも高速ですrepmat
(以下を参照)
bsxfun
タイピングが少なくてすむ
- を使用する
bsxfun
と、 を使用するのと同じようaccumarray
に、MATLAB を理解していることに満足できます。
bsxfun
は、入力配列を「単一次元」、つまり配列のサイズが 1 になる次元に沿って複製し、他の配列の対応する次元のサイズと一致するようにします。これが「シングルトン展開」と呼ばれるものです。余談ですが、シングルトン ディメンションは、 を呼び出すと削除されるディメンションですsqueeze
。
非常に小さな問題では、このrepmat
アプローチの方が高速である可能性がありますが、その配列サイズでは、両方の操作が非常に高速であるため、全体的なパフォーマンスに関してはほとんど違いがありません。高速化には 2 つの重要な理由bsxfun
があります。(1) コンパイルされたコードで計算が行われるため、配列の実際の複製が行われないことと、(2)bsxfun
マルチスレッド MATLAB 関数の 1 つであることです。
repmat
かなり高速なラップトップで、MATLAB R2012bとbsxfun
MATLAB R2012bの速度を比較しました。

私にとって、bsxfun
は よりも約 3 倍高速ですrepmat
。配列が大きくなると、違いはより顕著になります。

実行時のジャンプはrepmat
、1 MB の配列サイズ前後で発生します。これは、プロセッサ キャッシュのサイズと関係がある可能性がありbsxfun
ます。出力配列を割り当てるだけでよいため、ジャンプはそれほど悪くはありません。
以下に、タイミングに使用したコードを示します。
n = 300;
k=1; %# k=100 for the second graph
a = ones(10,1);
rr = zeros(n,1);
bb = zeros(n,1);
ntt = 100;
tt = zeros(ntt,1);
for i=1:n;
r = rand(1,i*k);
for it=1:ntt;
tic,
x = bsxfun(@plus,a,r);
tt(it) = toc;
end;
bb(i) = median(tt);
for it=1:ntt;
tic,
y = repmat(a,1,i*k) + repmat(r,10,1);
tt(it) = toc;
end;
rr(i) = median(tt);
end