为什么a
与b
中的matlab
不一样?
a = signal;
b = exp(log(signal));
如果我绘制a和b,信号不一样,有什么帮助吗?
答案 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
完全相反 - 除了舍入误差。 signal
和exp(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
仍会使其反转,但您会得到不同处理的复杂结果,并且看起来完全不同,具体取决于您之后对它们执行的操作。