将1200个值划分为10个区间统计数量的MATLAB代码问题排查
问题排查与解决方案
你的代码主要存在两个问题,导致统计结果异常:
- 最后一个区间完全未被统计:循环只处理了前9个区间(
k=1:intervals-1),第10个区间(从min_SDRR+9*int_SDRR到max_SDRR)完全没被纳入统计,这直接导致总计数凑不够1200。 - 累加结果的诱因:虽然你写的区间条件逻辑上是互斥的,但双层循环的写法容易因为边界判断或浮点精度问题出现重复统计,而且效率很低。
修复后的手动循环代码
先把你的原始代码修复好,解决上述问题:
load('Data.mat') % 先取消注释并正确赋值Train(确保i_tr是你之前定义的有效索引) Train = Data(i_tr,:); l_train = height(Train); Sdrr = Train.SDRR; min_SDRR = min(Sdrr); max_SDRR = max(Sdrr); intervals = 10; int_SDRR = (max_SDRR - min_SDRR)/intervals; % 直接用max-min代替range,逻辑更清晰 data = zeros(intervals,1); for j = 1:l_train x = Sdrr(j); found = false; % 处理前9个左闭右开区间 for k = 1:intervals-1 lower = min_SDRR + (k-1)*int_SDRR; upper = min_SDRR + k*int_SDRR; if x >= lower && x < upper data(k) = data(k) + 1; found = true; break; % 找到对应区间后立刻跳出内层循环,避免无效判断和重复统计 end end % 专门处理最后一个区间(包含最大值) if ~found data(intervals) = data(intervals) + 1; end end
这里的关键改进:
- 取消了
Train赋值的注释(确保你用的是正确的训练数据集) - 内层循环找到匹配区间后立即
break,避免不必要的循环和潜在的重复计数 - 单独处理最后一个区间,确保所有数据点都被统计到
更高效的MATLAB内置函数方案
其实MATLAB有专门的区间统计函数histcounts,完全不用手动写循环,代码简洁还不容易出错:
load('Data.mat') Train = Data(i_tr,:); Sdrr = Train.SDRR; intervals = 10; % 生成10个等宽区间的边界(11个点对应10个区间) edges = linspace(min(Sdrr), max(Sdrr), intervals + 1); % 统计每个区间内的数值数量 data = histcounts(Sdrr, edges);
linspace会自动生成从最小值到最大值的等间距边界点,histcounts会直接返回每个区间的计数,运行后用sum(data)就能验证总计数是否为1200,确保所有数据都被正确统计。
内容的提问来源于stack exchange,提问作者GucciBucketHat
相关产品推荐
相关产品推荐

