为什么log和exp matlab函数会产生相反的结果?

时间:2014-01-27 14:58:53

标签: matlab logarithm exponential

为什么ab中的matlab不一样?

a = signal;
b = exp(log(signal));

如果我绘制a和b,信号不一样,有什么帮助吗?

3 个答案:

答案 0 :(得分:5)

负数-x的对数为y = log(x)+pi*1i。因此,当您将指数函数应用于y时,您将留下零虚部(或看似零的东西)。试试这个例子:

format long
x = -1;
y = exp(log(x))
abserr = abs(x-y)

阅读有关复数对数here的更多信息。

由于浮点,当然也可能存在不准确性。如果您的signal的值接近1/eps(或-1/eps),则绝对错误尤为重要。尝试

x = 1/eps;
y = exp(log(x));
abserr = abs(y-x)  
relerr = abs(y-x)/abs(x)

返回

abserr =

  11.500000000000000


relerr =

     2.553512956637860e-15

请注意,相对误差很小。在floating point calculations相对误差通常是我们希望控制的。

答案 1 :(得分:3)

霍希勒的回答当然是正确的 - 但我认为它错过了密谋部分,这导致了OP的混乱。由于Matlab在必要时使用复数,log也定义为负数,exp应与log完全相反 - 除了舍入误差。 signalexp(log(signal))之间的数字差异几乎总是非常小。一个例子:

>> signal = (-2:2)'

signal =

    -2
    -1
     0
     1
     2

>> exp(log(signal))

ans =

                         -2 +  2.44929359829471e-16i
                         -1 +  1.22464679914735e-16i
                          0 +                     0i
                          1 +                     0i
                          2 +                     0i

但是,plot的行为会根据参数是实数还是复数而有所不同:

subplot(1, 2, 1)
plot(signal, '.-')
subplot(1, 2, 2)
plot(exp(log(signal)), '.-')

结果

虽然这两个向量的数值差异可以忽略不计,但看起来完全不同。

这是因为如果使用单个实值向量作为参数调用,plot使用垂直轴的给定向量值和水平轴的向量索引(1,2,...)。但是,如果使用单个复值向量调用,则plot实部用于水平轴,虚部用于垂直轴。即,上述代码中对plot的两次调用等同于

plot(1 : 5, signal, '.-')

plot(real(exp(log(signal))), imag(exp(log(signal))), '.-')

分别

答案 2 :(得分:1)

如果使用复数或负值的log,Matlab会计算复数对数。这将产生意想不到的结果。

a = abs(signal);
b = exp(log(a));

将按预期工作(尽管信号的复杂部分和符号将在此过程中丢失)。

b = log(exp(signal));

也可以工作,因为它不需要处理复数对数。

换句话说,您必须确保尊重您的功能域。真实的(在非复杂的)log的域中都是正(!)实数,而真exp的域是所有数字。另一方面,log的图像都是实数,而真实exp的图像都是正实数。这就是为什么它以一种方式工作,而不是另一种方式。你试图做一些真正的log无法做到的事情,所以Matlab会切换到复杂的log。虽然exp仍会使其反转,但您会得到不同处理的复杂结果,并且看起来完全不同,具体取决于您之后对它们执行的操作。