2016-03-28 43 views
2

Oldukça Matlab/Octave ve Makine öğrenme değilim, ama şimdiye kadar sana toplamı için iteratif döngüler önlemek ve mümkün olduğunca vektörize istiyorum öğrendim.Matlabda iki toplamı hesaplamaları hangisi/Octave bir satır vektör üzerinde en uygunudur?

Verilen gibi bir satır vektörü: İçgüdülerim bize söylüyor iken

  • sum(x)
  • x * ones(length(x),1)

: Bu iki yöntemle toplamını hesaplayabilirsiniz x = [ 1,2,3,4,5]

fonksiyonlar yerleşik, ikinci seçenek daha 'vectorized' hissediyor.

daha iyi ve neden hangisi? Performansta iki bellek arasında bellek kullanımı, vb. Tamam

cevap

3

, öyle görünüyor ki: "Tüm olanlar" vektör tahsis zamanı/bellek havai buna değer değil. Bir tekrar tekrar aynı uzunlukta vektörler üzerinde toplamak için gerektiği zaman
Ancak, vektörün tahsis böylece ortalama yükü azaltır, sadece bir kez yapılabilir . Benim makinede

:

"önbelleğe alma" Tüm olanlar vektör:

N=100;T=500000; x=rand(T,N); 
tic;o=ones(N,1);for ii=1:T, x(ii,:)*o;end;toc 

Geçen zaman 0,480388 saniyedir.

sum kullanırken:

tic;for ii=1:T, sum(x(ii,:));end;toc 

Geçen zaman 0,488517 saniyedir.

Yani, biraz daha hızlı tekrarlanan toplamları durumunda "Tüm olanlar" Vektör yöntemi kullanmak bu. Eğer time calculation dışarı "tüm olanlar" vektör tahsisini alırsak


, sen oluşturmuş oluruz:

N=100;T=500000; x=rand(T,N);o=ones(N,1); 
tic;for ii=1:T, x(ii,:)*o;end;toc 

Geçen süre 0'dır.477762 saniye.

Ama yine, bir noktada bunu ayırmak gerekecek ...

+0

iyi nokta. Ben hafıza bir endişe, önceden tahsis değilse açıkça, hesaplamanın zamanda kişinin vektör tahsis ve sen dışarı olanları oluşturmak için zaman çekerseniz olanlar vektör yeniden tekrarlayan hesaplama – Ray

+0

ile destek getirisine olabilir Hesaplama süresinin dolması için geçen süreye göre geçen zaman nedir? – Ray

+0

@Ray lütfen güncellememi görün. – Shai

1

, biraz daha araştırma yaptım: sum() inşa edilmiş bir performans açısından bakıldığında

çok daha iyidir: Ben olanlar ekstra vektörü kullanarak tahmin

x = rand(1,100000000); 
    %slowwwww 
    t = cputime; x * ones(length(x),1); e= cputime - t; e 

    % Faster 
    t = cputime; sum(x); e= cputime - t; e 

da gereksiz bellek kullanımıdır. sum() üzerinden performans artışı olmadığından, yerel olmayan yöntem çok daha az uygundur. sum iyidir gibi Genelde

+3

'sum' kesinlikle daha hızlıdır. '' ''' Oluşturmak için gerekli olan ekstra bellek ve zaman, işleri yavaşlatır. – rayryeng

+1

Neden "x * olanlar (uzunluk (x), 1)" ile "x * toplam (x)" arasında karşılaştırma yapmıyorsunuz? "Sum (x)" ile karşılaştırmak istediğini düşündüm. Yine de toplamı çok daha hızlıdır. http://hg.octave.org/octave/file/tip/liboctave/operators/mx-inlines: döngü için sadece "+ =" farklı bir algoritma kullanır toplamı için "ekstra" bayrak göz at .cC# l1354 – Andy

+0

s/yapamaz ... Ben @Andy ayy, yazım hatası, 'olanları yaratmak beri cevap – Andy