2016-03-28 11 views
2

私はMatlab/OctaveとMachine learningにかなり関心がありますが、これまでのところ、加算とベクトル化を可能な限り反復するループを避けたいと思っています。私の腸は、私たちに教えてくれますがMatlab/Octaveの2つの合計計算のうち、ローベクトルで最適なものはどれですか?

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

のような行ベクトルを考える:x = [ 1,2,3,4,5]

次の2つの方法で合計を計算することができます第2のオプションは、より「ベクトル化」されていると感じます。

どれが最適で、その理由は?パフォーマンスとメモリ使用などの2つの間にトレードオフがありますか?はるかに優れているsum()に内蔵された性能の観点から

答えて

3

一般に、sumが良いと思われます。「すべてのもの」ベクトルを割り当てる時間/メモリのオーバーヘッドはそれに値するものではありません。
しかし、同じ長さのベクトルを繰り返し合計する必要がある場合、ベクトルの割り当ては1回しか実行できないため、平均オーバーヘッドが減少します。私のマシン上で

"キャッシュ" すべてのものベクトル:

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

経過時間が0.480388秒です。

sumを使用している間:

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

経過時間が0.488517秒です。

だから、それはが若干速くが繰り返さ和の場合には、「すべてのものを」ベクトル方式を使用することです。


あなたがtime calculationのうち、 "すべてのもの" ベクトルの割り当てを取る場合は、あなたがで終わる:

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

経過時間は0です。477762秒。

しかし、再び、あなたはいくつかの点で、それを割り当てる必要があります...

+0

良い点。私は明示的に計算の時点でベクトルを割り当てています。メモリが問題でない場合、それらを事前に割り当てて再利用すると、反復計算でyeild boostが発生する可能性があります。 – Ray

+0

計算あなたの経過時間のバージョンコストの経過時間は何ですか? – Ray

+0

@レイ私の更新をご覧ください。 – Shai

1

OK]をクリックして、いくつかのより多くの掘削をした私はものの余分なベクターを用いて推測

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 

も不要なメモリを使用することです。 sum()を超えるパフォーマンスの向上がないため、非ネイティブメソッドははるかに最適ではありません。

+3

は 'sum'は間違いなく高速です。 「もの」を作成するのに必要な余分なメモリと時間は物事を遅らせるでしょう。 – rayryeng

+1

"x * ones(length(x)、1)"と "x * sum(x)"を比較してみませんか?私はあなたが "sum(x)"と比較したいと思った。それにもかかわらず、合計ははるかに高速です。 forループで "+ ="以外のアルゴリズムを使用するsumの "extra"フラグを見てください:http://hg.octave.org/octave/file/tip/liboctave/operators/mx-inlines .cc#l1354 – Andy

+0

s/do/do ...質問を反転しました – Andy

関連する問題