刚从别的语言转过来写 MATLAB 的人,几乎都会在这里翻一次车:想算以 10 为底的对数,顺手写了 log(100),结果拿到 4.6052,不是 2。原因不复杂,MATLAB 沿用了数学里的写法,log 就是 ln。
三个常用函数的分工
log(x) % 自然对数,底 e
exp(x) % e 的 x 次方,log 的反函数
log10(x) % 以 10 为底
log2(x) % 以 2 为底
log1p(x) % log(1+x),x 很小时更精确验证一下:log(exp(3)) 得到 3,log10(1000) 得到 3,log2(1024) 得到 10,三个都对得上。
任意底数用换底公式
MATLAB 没有提供 log_b 这样的通用函数,要算以 3 为底的对数,就自己换底:
logb = @(x, b) log(x) ./ log(b);
logb(81, 3) % 结果为 4用匿名函数定义一次,后面直接调用,比每次都写换底公式清爽。注意是点除,输入向量时也能一次算完。
矩阵对数不是逐元素
log 对矩阵是逐元素运算,而 logm 算的是矩阵对数,两者结果完全不同。做信号处理或者解矩阵方程时,这两者混用会得到毫无意义的数字,报错倒不一定有。要逐元素就 log,要矩阵函数就 logm。
输入为负数和零
log(0) % -Inf
log(-1) % 0.0000 + 3.1416i实数域里 log 只对正数有定义。MATLAB 遇到负数会自动转到复数域返回结果,不报警告。所以处理测量数据时,如果 log 结果突然冒出虚部,先查原始数据里是不是有负值或零,通常是数据没清洗。
画对数坐标的图
不想改数据,只想让坐标轴按对数刻度显示,用 semilogy、semilogx、loglog 就行,比先取 log 再画图省事,刻度标签也更直观。
记住一句话:MATLAB 里 log 是自然对数,底数 10 和 2 各有专用函数,其他底数自己换底。