You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab最小二乘拟合概率密度函数报维度错误及绘图异常排查

问题产生原因

异常的核心是维度不匹配引发的连锁错误,Matlab给出的运算符修改提示属于误判:

  • 初始写法Astar = inv(H'*H)*H'*y_报错的本质不是乘法类型选错,是向量维度不符合矩阵运算要求:
    • 代码中bin是步长0.5的行向量,hist返回的频数结果f(即赋值后的y_)同样是1×n的行向量;而构造的设计矩阵H是n行2列的列向量组格式,inv(H'*H)*H'计算得到的是2×n的系数矩阵。
    • 标准矩阵乘法要求前一个矩阵的列数等于后一个矩阵的行数,2×n矩阵和1×n行向量做*运算时内维度n≠1,自然触发维度不匹配报错,Matlab的自动修复提示错误推荐了逐元素运算.*,属于误导。
  • 修改为.*后出现平直线,是因为逐元素运算完全偏离最小二乘的计算逻辑:
    • 逐元素运算要求两个变量维度完全一致,Matlab会自动把1×n的y_广播复制为2×n的矩阵,和2×n的inv(H'*H)*H'逐位相乘,最终得到的Astar是2×n的矩阵,完全不是最小二乘要求的2×1参数向量(仅包含截距、斜率两个系数)。
    • 后续执行H*Astar时,n×2的矩阵乘2×n的矩阵会得到n×n的矩阵,Matlab默认绘制多列数据时如果维度和x轴不匹配,仅读取第一列数据绘图,就会出现你看到的底部异常平直线。
正确修正方案

不需要用逐元素乘法,只需要统一向量维度为列向量即可:

N = 10000;
mu = 5; sigma = 2;
r = randn(N,1);
x = mu+sigma*r;
bin=mu-6*sigma:0.5:mu+6*sigma;
f=hist(x,bin);
plot(bin,f,'bo'); hold on;
xlabel('bin');
ylabel('f');

y_ = f(:); % 强制转为列向量,规避维度问题
x_ = bin(:);

H = [ones(length(y_),1),x_];
Astar = inv(H'*H)*H'*y_; % 保留标准矩阵乘法即可
% 更推荐用反斜杠求解,数值稳定性更好:Astar = H\y_;
Ytilde = H*Astar;
plot(x_,Ytilde, 'r-','LineWidth',1)

异常运行结果参考:
拟合曲线底部出现异常平直线的错误输出

内容的提问来源于stack exchange,提问作者lambduh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:36:37