5

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

我测试了几个输入,似乎 log(a*b) 更快。有经验的大侠能不能给点意见?也许警告可能并非总是如此,或者我应该小心的其他事情?所以在第一种情况下,我们有 1 个对数运算和 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.

在某个时间点,时间比率会饱和。饱和的位置取决于您的处理器架构,但差异至少是一个数量级。

于 2013-08-22T16:50:51.913 回答
9

请注意,虽然log产品的计算速度更快,但由于机器精度,有时可能会不正确。

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

另一个有问题的情况是使用小数字,使得它们的乘积由于机器精度而变为零(正如 Amro 所提到的)。

于 2013-08-22T17:07:38.860 回答
2

虽然它通常会更快,log(a*b)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在这两种情况下都会评估,但第二种情况比第一种情况要快得多。

于 2013-08-23T12:57:48.810 回答