刚从别的语言转过来写 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 各有专用函数,其他底数自己换底。