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