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