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

时间:2013-08-22 16:48:33

标签: matlab math numerical-methods

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

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

编辑:

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

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

由于

3 个答案:

答案 0 :(得分: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 :(得分:9)

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

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

另一个有问题的案例是使用较小的数字,使其产品由于机器精度而变为零(如Amro所述)。

答案 2 :(得分: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,但第二种情况要比第一种情况快得多。