在Matlab中log(a * b)总是比log(a)+ log(b)更快吗?
我测试了几个输入,似乎log(a * b)更快。 你能有更有经验的人给我一些意见吗? 也许警告说这可能并非总是如此,或者某些事情 否则我应该小心?所以在第一种情况下我们有1个日志操作 和1乘法,在第二种情况下,我们有两个日志操作和一个求和。
编辑:
要添加到我的原始帖子,更一般的问题是:
是log(a * b * ... * z)总是快于log(a)+ log(b)+ ... + log(z)?
由于
答案 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
,但第二种情况要比第一种情况快得多。