You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在MATLAB直方图中拟合核分布曲线?附脚本优化问询

MATLAB直方图优化与核密度拟合方案

嘿,我来帮你搞定这个MATLAB脚本的问题~

一、'stacked'参数完全没必要!

  • 单组数据时,bar'stacked'参数纯属多余!它是用来把多组柱状图堆叠展示的,单组数据用它既不会有任何效果,还让代码显得冗余,直接删掉就行。
  • 另外原脚本里的[cntG']转置也没必要,histcounts返回的cntG本身就是适合bar输入的向量,不用多此一举转置。

二、大幅简化原脚本

原脚本手动计算bin中心的步骤可以用更省心的方式替代,甚至直接用histogram函数一步到位,比histcounts+bar的组合简洁太多:

% 简化后的基础直方图脚本
yG = ... % 替换成你的Excel导入数据(比如用readmatrix读取)
BinEdges = linspace(0,35,70); 

figure(1); cla; hold on;
% 直接用histogram,自动处理bin划分和计数展示
histogram(yG, 'BinEdges', BinEdges, 'FaceColor', 'lightblue');
xlabel('Length(mm)');
ylabel('Count');

要是你坚持想用histcounts+bar的组合,简化后是这样:

yG = ... % 你的数据
BinEdges = linspace(0,35,70); 
cntG = histcounts(yG, 'BinEdges', BinEdges);
b = BinEdges(1:end-1) + diff(BinEdges)/2; % 这步保留也没问题,但histogram更省事

figure(1); cla; hold on;
bar(b, cntG); % 去掉多余的stacked参数和转置
xlabel('Length(mm)');
ylabel('Count');

三、添加核密度(Kernel)拟合曲线

用MATLAB内置的ksdensity函数就能轻松实现,注意要把核密度值转换成和直方图计数匹配的尺度(因为核密度返回的是概率密度,需要乘以数据总数×bin宽度才能和计数对齐):

% 在直方图代码之后添加这段代码即可
% 计算核密度分布
[f, x_values] = ksdensity(yG); 
% 转换密度尺度,让它和直方图计数匹配
bin_width = diff(BinEdges);
bin_width = bin_width(1); % 因为是等宽bin,取第一个宽度就行
total_samples = length(yG);
f_scaled = f * total_samples * bin_width;
% 绘制核密度拟合曲线
plot(x_values, f_scaled, 'LineWidth', 2, 'Color', 'crimson');
legend('实测数据直方图', '核密度拟合'); % 可选,添加图例更清晰

完整优化后的脚本

yG = ... % 替换为你的Excel导入数据(例如:yG = readmatrix('你的文件.xlsx');)
BinEdges = linspace(0,35,70); 

figure(1); cla; hold on;
% 绘制直方图
histogram(yG, 'BinEdges', BinEdges, 'FaceColor', 'lightblue');
% 计算并绘制核密度拟合曲线
[f, x_values] = ksdensity(yG); 
bin_width = diff(BinEdges);
f_scaled = f * length(yG) * bin_width(1);
plot(x_values, f_scaled, 'LineWidth', 2, 'Color', 'crimson');
% 标注与美化
xlabel('Length(mm)');
ylabel('Count');
legend('实测数据直方图', '核密度拟合曲线');
grid on; % 可选,添加网格让图更易读

内容的提问来源于stack exchange,提问作者K.C. Timothy YICK

火山引擎 最新活动