2013-08-22 13 views
5

log(a * b)はlog(a)+ log(b)より常にMatlabで速いですか?log(a * b)はlog(a)+ log(b)より常にMatlabで高速ですか?

いくつかの入力をテストしたところ、log(a * b)の方が速いようです。 あなたはもっと経験豊富な人が私にこれについていくつかの意見を与えることができますか? これは必ずしもそうではないかもしれないという警告かもしれません 他にも注意が必要ですか?したがって、最初のケースでは、1つのログ操作 と1つの乗算があり、2番目のケースでは2つのログ操作と1つの合計があります。

編集:私の最初の投稿に追加するには

、より一般的な質問は次のとおりです。

はログ常に速く(a * b *表... * z)のログより(A)+ログ(ありますb)+ ... + log(z)?対数を計算することは高価であるため

おかげ

+4

私は 'log' time >> 'multiply time'>' add time'と考えています。だからこの観察は意味をなさない。 – lurker

答えて

13

log(a*b)は常に、より高速にする必要があります。 log(a*b)では一度だけ行い、log(a)+log(b)では2回行います。

対数、指数などと比べると計算の計算量は少なくなります。プロセッササイクルに関しては、総和と積は一般に5未満ですが、いくつかのアーキテクチャでは指数関数と対数は50から200サイクルになります。

(B)+ ... +

はい(z)をログログ(a * b *表... * z)は常に速くログより(A)+ログです。絶対に。可能な限り対数を計算しないでください。時間の比率が飽和し、いくつかの点で

a=rand(5000000,1); 

% log(a(1)*a(2)...) 
tic 
for ii=1:100 
    res=log(prod(a)); 
end 
toc 
% Elapsed time is 0.649393 seconds. 

% log(a(1))+log(a(2))+... 
tic 
for ii=1:100 
    res=sum(log(a)); 
end 
toc 
% Elapsed time is 6.894769 seconds. 

はここで小さな実験です。飽和する場所はプロセッサのアーキテクチャーによって異なりますが、その差は少なくとも桁違いです。

+0

この差異は、複雑なログの場合にはさらに劇的であり、例えば、「a」は複雑なランダム値のベクトルである。ここでは – horchler

+3

に注意してください。[0,1]の範囲の小さな値を掛け合わせるとすぐにゼロになります。この種の問題は、[確率](http://en.wikipedia.org/wiki/Log_probability)を使って作業するとき、実際の生活の中でしばしば起こります...スピードはすべてではなく、作業中の数値安定性も心配する必要があります浮動小数点数を使用します。 – Amro

+0

上記の例では、製品がゼロになった約700個の要素(5百万から5万回)の後でのみ、「sum(cumprod(a)> 0)」というメッセージが表示され、729 – Amro

9

製品のlogを計算するのが速いことに注意してください。機械精度のために不正確になることがあります。

問題の1つは、多くの整数オペランドまたは大きい数をオペランドとして使用することです。この場合、製品a_1 * a_2 * ... a_nはオーバーフローになりますが、対数の合計は計算されません。

もう1つの問題は、機械精度(Amroで述べたように)によって製品がゼロになるように小さな数値を使用することです。

+1

、部分的な製品を作成し、オーバーフローの前に乗算して、そのログを取ることができます。オーバーフローしてログを取る前に、同じことを続け、用語を製品に収集し続けます。同意する? – user2381422

+1

はい、実現可能なようです。 –

+2

+1答えがすでに述べられている質問に対する良い観察。 – Werner

2

の代わりにlog(a*b)を実行するのが通常より高速ですが、a*bを評価するのが難しい場合、これは成立しません。この場合、実際には2番目の方法を使用するほうが速い場合があります。

例:もちろん

a = 0; 
b = Inf; 
tic,for t = 1:1e6 log(a*b); end,toc 
tic,for t = 1:1e6 log(a)+log(b); end,toc 

それは両方のケースでNaNに評価しますが、もう一つは最初のものよりもかなり高速です。

+0

0 * Infは最新のプロセッサでは高速で処理されます。それについて「評価するのが難しい」ものは何もありません。 (以前は、いくつかのプロセッサがInfinitiesとNaNで算術演算を行っていましたが、それはもはや本当の問題ではありません) –

+0

@StephenCanonのタイミングは何とか遅いです。おそらく遅い部分は、ゼロを無限に掛けて 'NaN'を生成するのではなく、' log(NaN) 'を評価することです。もちろん、遅いのは相対的で、「通常の」ケースは約2倍の速さです。 –

+1

あなたのシステムログ(nan)はlog(0)とlog(inf)よりも遅いかもしれませんが、それは一般的に適用可能な発見ではなく、1つの数学ライブラリ実装の奇妙なものです。 –

関連する問題