MATLAB’de bsxfun’ı ne zaman kullanabiliriz?
bsxfun‘ı kullanmak için 3 sebep var:
bsxfun,repmat‘tan daha hızlıdır.bsxfundaha az kodlama gerektirir.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')


