Matlab, ne zaman bsxfun kullanmak için en uygun olanı bu mu?
Sorum Şu:Bu YÜZDEN sık sık işlevini kullanma ile ilgili sorular Matlab için iyi bir çok sorunun yanıtını 3 ** fark ettim. Neden?
Motivasyon:bsxfun
, Matlab belgelerinde aşağıdaki örnek verilmiştir:
A = magic(5);
A = bsxfun(@minus, A, mean(A))
Tabii ki, aynı işlemi kullanarak yapabiliriz:
A = A - (ones(size(A, 1), 1) * mean(A));
Ve aslında basit bir hız testi İkinci yöntem, daha hızlı hakkında olduğunu gösterir. Neden ilk yöntemi kullanın? "Yaklaşım. manuel daha bsxfun
kullanarak çok daha hızlı olacak bazı durumlar vardır diye tahmin ediyorum Böyle bir duruma örnek ve daha hızlı olarak neden bir açıklama görmeyi gerçekten isterim.
Ayrıca, son bir eleman bu soruyu, yine Matlab belgeler için bsxfun
: "C = bsxfun(eğlenceli,A,B) geçerlidir element-by-element ikili işlem tarafından belirtilen işlevi işlemek için eğlenceli diziler A ve B ile singleton genişleme sağladı.". İfade "ile singleton genişleme"? etkin ne yapar
CEVAP
Kullandığım Üç Sebep vardırbsxfun
(, *documentation*28) orada
bsxfun
daha hızlırepmat
(aşağıya bakınız)bsxfun
daha az yazmak gerekiraccumarray
, kullanmak gibibsxfun
kullanarak beni * * * * benim anlayış hakkında iyi hissettiriyor.
bsxfun
çoğaltmak girdi dizi boyunca onların "singleton Boyutlar", yani boyutları açısından hangi büyüklükte dizisi 1'dir, ki bunlar aynı boyutta ilgili boyutun diğer dizi. Bu ne denir"". singleton expasion Bir kenara olarak, singleton boyutları squeeze
ararsan düşecek olanlardır.
Mümkün bunun için çok küçük sorunlar, repmat
yaklaşım daha hızlı - ama o dizi boyutu, her iki işlem çok hızlı o büyük olasılıkla bir şey fark etmez açısından genel performansı. İki önemli sebep bsxfun
daha hızlı: (1) hesaplama olur derlenmiş kod anlamına gelir gerçek çoğaltma dizisi asla olmaz, ve (2) bsxfun
bir çok iş parçacıklı Matlab fonksiyonları.
Terbiyeli hızlı bilgisayarımda repmat
ve R2012b bsxfun
arasında hızlı bir karşılaştırma yap.
Bana, bsxfun
repmat
'den yaklaşık 3 kat daha hızlı olduğu için. Eğer fark diziler daha büyük olursa daha belirgin olur
Atlama zamanı repmat
olur etrafında bir dizi boyutu 1Mb, hangi-ebil var boyutu benim işlemci önbellek - bsxfun
yok olsun kötü bir atlama, çünkü sadece ihtiyaçlar için tahsis çıktı dizi.
Kodu aşağıda bulabilirsiniz zamanlama için kullandım
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
Ne zaman TCP yerine UDP kullanmak için...
(Ya da ihmal) kullanmak için zaman var...
Ref vs kullanmak için zaman...
Vanilya JavaScript vs kullanmak için n...
div ne zaman bir eylemi tetiklemek içi...