Matlab曲线拟合报Vectors must be the same length错误求解
问题描述
对随机生成的正态分布数据做曲线拟合时触发向量尺寸不匹配报错,拟合目标为正态分布概率密度函数:
运行后仅能画出直方图散点,无法正常绘制拟合曲线,异常运行效果如下:
原始实现代码
N = 100; mu = 5; stdev = 2; x = mu+stdev*randn(N,1); bin=mu-6*stdev:0.5:mu+6*stdev; f=hist(x,bin); plot(bin,f,'bo'); hold on; x_ = x(1):0.1:x(end); y_ = (1./sqrt(8.*pi)).*exp(-((x_-mu).^2)./8); plot(x_,y_,'b-'); hold on;
报错信息
Error using plot
Vectors must be the same length.
错误成因
报错和显示异常来自两处逻辑问题:
- 拟合曲线的x轴序列生成逻辑错误:代码用未排序的随机样本首尾值
x(1)、x(end)作为x_的区间端点,由于随机样本的顺序完全打乱,当x(1) > x(end)时,Matlab的冒号运算符会返回空数组,直接触发绘图向量长度不匹配错误;即使x(1) < x(end),该随机区间也和直方图使用的固定bin范围不对齐,无法和直方图匹配。 - 纵轴尺度不匹配:代码计算的
y_是标准正态分布概率密度,取值范围在0~0.2区间,而直方图纵轴f是分箱的样本计数,总和为100,二者尺度差两个数量级,就算长度匹配,曲线也会紧贴x轴,完全达不到拟合显示效果。
修复方案
- 拟合曲线的x轴范围直接对齐直方图的分箱区间,不再使用随机样本的首尾值,从根源避免空数组和范围不对齐问题;
- 对概率密度值做尺度缩放:概率密度乘以分箱宽度得到单个样本落在对应分箱的概率,再乘以总样本数,就得到和直方图频数尺度一致的理论拟合值。
修复后可直接运行的代码如下:
N = 100; mu = 5; stdev = 2; x = mu+stdev*randn(N,1); bin = mu-6*stdev:0.5:mu+6*stdev; bin_width = 0.5; f = hist(x,bin); plot(bin,f,'bo'); hold on; % 拟合曲线x轴和直方图范围对齐,需要更平滑的曲线可把步长改小为0.1 x_ = mu-6*stdev:0.1:mu+6*stdev; % 缩放概率密度到频数尺度 y_ = N * bin_width * (1./(stdev*sqrt(2.*pi))).*exp(-((x_-mu).^2)./(2*stdev^2)); plot(x_,y_,'b-','LineWidth',1.5); hold off; xlabel('x'); ylabel('频数'); legend('样本直方图','理论正态分布拟合曲线','Location','best');
运行后即可得到直方图和正态拟合曲线完全对齐的正常结果。
内容的提问来源于stack exchange,提问作者lambduh
相关产品推荐
相关产品推荐

