bsxfun'ı kullanmak için 3 sebep var:

  1. bsxfun, repmat'tan daha hızlıdır.
  2. bsxfun daha az kodlama gerektirir.
  3. bsxfun, accumarray'de olduğu gibi kodun anlaşılabilirliğini arttırır.

bsxfun girdi değerlerini tekil (singleton) boyutları, yani dizilimin 1 olan boyutlarını diğer dizilimdeki denk gelen boyutlar yönünde uzatır ve işlemi iki değeri kullanarak yapar. Tekil boyutlar squeeze ile düşen boyutlardır.

Çok düşük boyutlarda repmat'ın daha hızlı olacağını düşünebiliriz fakat boyut büyüdükçe bu hız düşecektir. bsxfun 'ı hızlı kılan iki sebep vardır. (1) hesaplar derlenmiş kodda yapılır, yani verinin tekrar kopyalanması gerekmez, (2) bsxfun çok izlekli (multithreaded) MATLAB fonksiyonlarından biridir.

Altta bir karşılaştırma var:

n = 300;
a = ones(10,1);
t_repmat = zeros(n,1);
t_bsxfun = zeros(n,1);
ntt = 100;
t = zeros(ntt,1);
for i=1:n;
   r = rand(1,i);  % r bir satır vektör, a ise sütun vektör
   for it=1:ntt
      tic
      x = bsxfun(@plus, a, r);
      t(it) = toc;
   end
   t_bsxfun(i) = median(t);
   for it=1:ntt
      tic
      y = repmat(a, 1, i) + repmat(r, 10, 1);
      t(it) = toc;
   end
   t_repmat(i)=median(t);
end

plot(1:n, t_bsxfun, 1:n, t_repmat)
legend('bsxfun', 'repmat')

bsxfun