MATLAB中如何归一化hist()函数生成的直方图并修复报错
报错根因
你调用的是旧版hist()函数,它的返回值是和bin等长的计数数值数组,不是直方图对象,不存在.Values、.BinWidth这类对象属性,因此用点索引访问属性时会触发"Dot indexing is not supported for variables of this type"报错。
手动归一化实现(不依赖histogram内置归一化)
你不需要从返回值里取计数和bin宽度,这两个值你本身就已经定义/获取到了:
f = hist(x,bin)得到的f本身就是每个bin对应的样本计数,不需要再访问.Values- bin宽度是你生成bin序列时设置的步长,这里是0.5,不需要从对象属性读取
修正后的完整代码如下:
N = 1000; 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'); % 归一化逻辑:直方图总面积为1,对齐概率密度 counts = f; sum_counts = sum(counts); width = 0.5; % bin序列步长即单bin宽度 f_normalized = counts / (sum_counts * width); % 绘制归一化结果 figure; plot(bin, f_normalized, 'bo', 'MarkerFaceColor','b'); hold on % 叠加理论正态分布PDF做验证 pdf_curve = normpdf(bin, mu, stdev); plot(bin, pdf_curve, 'r-', 'LineWidth',1.5); legend('手动归一化直方图','理论正态分布PDF'); hold off
归一化逻辑说明:每个bin的矩形高度为「bin内样本数/(总样本数*bin宽度)」,所有bin的矩形面积之和为1,完全匹配概率密度的定义,可以直接和理论分布PDF做对比。
内容的提问来源于stack exchange,提问作者lambduh
相关产品推荐
相关产品推荐

