基于指定范围分组计算两列均值的MATLAB代码问题
搞定按区间计算双列均值的问题
首先,咱们先把你的数据理清楚——你给出的是一组成对的数值,得先把它转成两列的矩阵才好处理,不然MATLAB没法区分哪是第一列哪是第二列。比如在MATLAB里可以这么转:
data = reshape([49.6 46.1 49.65 46.3 50.1 47.03 50.2 47.06 51.35 46.027 51.36 46.20], 2, [])';
转完之后,data(:,1)就是你说的第一列数据,data(:,2)是对应的第二列数值。
为啥你的原代码跑不起来?
你的循环代码for i=49:1:100 meanWithinRange(i) = mean(data(i,1)); end踩了两个典型的坑:
- 你把区间的起始值(比如49、50)当成了数据的行索引,直接用
data(i,1)是取第i行的第一列,完全不是筛选落在区间里的数据 - 你要的是区间范围(比如[49,50))里的所有数据,不是单个数值,得先把符合条件的行挑出来再算均值
正确的实现方式
咱们可以用循环遍历每个区间,先筛选出符合条件的数据,再计算两列的均值,还能顺便处理空区间的情况(避免报错):
完整代码示例
% 第一步:把原始数据整理成两列矩阵 data = reshape([49.6 46.1 49.65 46.3 50.1 47.03 50.2 47.06 51.35 46.027 51.36 46.20], 2, [])'; % 定义区间的起始值:从49到99,每个区间是[lower, lower+1) lower_bounds = 49:1:99; % 初始化存储结果的数组,用来存每列的均值 col1_means = zeros(size(lower_bounds)); col2_means = zeros(size(lower_bounds)); % 遍历每个区间 for idx = 1:length(lower_bounds) lower = lower_bounds(idx); upper = lower + 1; % 生成筛选掩码:找出第一列落在[lower, upper)里的所有行 mask = data(:,1) >= lower & data(:,1) < upper; % 计算均值,空区间就用NaN标记(避免mean空数组报错) if any(mask) col1_means(idx) = mean(data(mask, 1)); col2_means(idx) = mean(data(mask, 2)); else col1_means(idx) = NaN; col2_means(idx) = NaN; end end % 把结果整理成表格,看着更清楚 results = table(lower_bounds', lower_bounds'+1, col1_means, col2_means, ... 'VariableNames', {'区间下限', '区间上限', '第一列均值', '第二列均值'}); disp(results);
你关心的几个区间结果
运行后,你要的几个区间结果会是:
- [49,50):第一列均值
49.625,第二列均值46.2 - [50,51):第一列均值
50.15,第二列均值47.045 - [51,52):第一列均值
51.355,第二列均值46.1135
偷懒的向量化方法(不用写循环)
如果不想写循环,MATLAB有现成的函数可以搞定,用discretize给数据分组,再用groupsummary直接算均值,效率更高:
data = reshape([49.6 46.1 49.65 46.3 50.1 47.03 50.2 47.06 51.35 46.027 51.36 46.20], 2, [])'; % 定义区间边界:从49到100,每个区间是[edges(i), edges(i+1)) edges = 49:1:100; % 给每个数据点分配对应的区间组 groups = discretize(data(:,1), edges); % 按组计算两列的均值 summary_results = groupsummary(data, groups, 'mean'); % 给每行加上区间标签,看着直观 interval_labels = arrayfun(@(x) sprintf('[%d,%d)', edges(x), edges(x+1)), 1:length(edges)-1, 'UniformOutput', false); summary_results.Properties.RowNames = interval_labels; disp(summary_results);
这个方法特别适合数据量很大的情况,比循环快很多。
内容的提问来源于stack exchange,提问作者lighting
相关产品推荐
相关产品推荐

