SORU
18 EKİM 2012, PERŞEMBE


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
18 EKİM 2012, PERŞEMBE


Kullandığım Üç Sebep vardırbsxfun (, *documentation*28) orada

  1. bsxfun daha hızlı repmat (aşağıya bakınız)
  2. bsxfun daha az yazmak gerekir
  3. accumarray, kullanmak gibi bsxfun 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.

enter image description here

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

enter image description here

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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Doug Bernards

    Doug Bernard

    7 Kasım 2007
  • thenewboston

    thenewboston

    4 ŞUBAT 2008
  • tutvid

    tutvid

    19 AĞUSTOS 2006