5

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

いくつかの入力をテストしたところ、log(a*b) の方が高速なようです。経験豊富な皆さん、これについて意見を聞かせてもらえますか? これが常に当てはまるとは限らないという警告、または私が注意すべき他の何かでしょうか? したがって、最初のケースでは 1 つの対数演算と 1 つの乗算があり、2 番目のケースでは 2 つの対数演算と 1 つの合計があります。

編集:

私の元の投稿に追加するために、より一般的な質問は次のとおりです。

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

ありがとう

4

3 に答える 3

13

log(a*b)対数の計算はコストがかかるため、常に高速である必要があります。あなたはそれlog(a*b)を一度だけやります、log(a)+log(b)あなたはそれを二度します。

積と和の計算は、対数や指数などに比べて簡単です。プロセッサ サイクルに関しては、和と積は一般に 5 未満ですが、指数と対数は、アーキテクチャによっては 50 から 200 サイクルになることがあります。

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

はい。絶対。対数の計算は可能な限り避けてください。

ここに小さな実験があります:

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.

ある時点で、時間の比率は飽和します。どこで飽和するかは、プロセッサのアーキテクチャによって異なりますが、その差は少なくとも 1 桁になります。

于 2013-08-22T16:50:51.913 に答える
9

積の計算logは高速ですが、機械の精度が原因で間違っている場合があることに注意してください。

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

もう1つの問題のあるケースは、機械の精度のために積がゼロになるような小さな数を使用することです(アムロが言及したように)。

于 2013-08-22T17:07:38.860 に答える
2

通常はこれよりも実行した方が高速ですが、評価が難しい場合は当てはまりませlog(a*b)ん。この場合、実際には 2 番目の方法を使用する方が高速である可能性があります。log(a) + log(b)a*b

例:

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、どちらの場合も に評価されますが、2 番目のものは最初のものよりもかなり高速です。

于 2013-08-23T12:57:48.810 に答える