log(a*b)在Matlab中总是比log(a)+ log(b)更快吗?

use*_*422 5 math matlab numerical-methods

log(a*b)在Matlab中总是比log(a)+ log(b)更快吗?

我测试了几个输入,似乎log(a*b)更快.你能有更有经验的人给我一些意见吗?也许警告说这可能并非总是如此,或者其他我应该小心的事情?因此,在第一种情况下,我们有1个日志操作和1个乘法,在第二种情况下,我们有两个日志操作和一个求和.

编辑:

要添加到我的原始帖子,更一般的问题是:

log(a*b*...*z)总是比log(a)+ log(b)+ ... + log(z)快吗?

谢谢

Mar*_*sen 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.
Run Code Online (Sandbox Code Playgroud)

在某些时候,时间比率会饱和.它饱和的地方取决于您的处理器架构,但差异至少是一个数量级.

  • 小心,在[0,1]范围内乘以很多小值将很快变为零.使用[概率](http://en.wikipedia.org/wiki/Log_probability)时,这类问题经常发生在现实生活中......所以速度并不是一切,你也应该关注工作时的数值稳定性浮点数. (3认同)

And*_*ein 9

请注意,虽然log产品计算速度较快,但由于机器精度的原因,有时可能会出错.

其中一个有问题的情况是使用大量整数操作数或大数字作为操作数.在这种情况下,产品a_1 * a_2 * ... a_n将导致溢出,而​​计算对数之和则不会.

另一个有问题的情况是使用较小的数字,使得它们的产品由于机器精度而变为零(如Amro所述).

  • +1对已经陈述答案的问题进行良好观察. (2认同)