You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指定范围分组计算两列均值的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:18