根据为 x 设置的条件将 x-y 数据重塑为子数组

Reshaping x-y data into sub-arrays based on conditions set for x

我有两个 6538x1 数据的数值数组,比方说直径和重量。每当直径落在所需范围内时,我想创建多个子阵列。例如,我的第一个子数组应该包括 10^0.65 到 10^0.70 范围内的直径和相应的权重值。第二个子数组应包括 10^0.70 到 10^0.75 范围内的直径和相应的权重值等。然后我想从每个子阵列中找到直径和重量的平均值,并创建一个显示两者之间相关性的图。

我尝试创建一个逻辑索引,然后找到落在所需范围内的直径平均值。例如,下面的行可以为我的第一个所需子阵列生成直径的平均值,但我如何才能获得相应的重量值并计算其平均值?

subarray1 = diameter <10^0.7 & diameter>=10^0.65;
meandiameter1 = mean(diameter(subarray1)); 

subarray1 是一个逻辑数组,告诉您 select 哪些元素满足您的条件。就像您使用 diameter 到 select 范围内直径的逻辑索引一样,您可以将它与 weight 数组一起使用,为您提供与范围内的直径相对应的权重你的范围。

meanweight1 = mean(weight(subarray1));

要使用多个范围的循环来做到这一点,您可以这样做:

diameter_ranges = [0.65 0.70; 
                   0.70 0.75;
                   0.75 0.80];

mean_diameters = zeros(size(diameter_ranges, 1), 1);
mean_weights = zeros(size(diameter_ranges, 1), 1);

for ii = 1:shape(diameter_ranges, 1)
    filter_selection = diameter >= diameter_ranges(ii, 0) & diameter < diameter_ranges(ii, 1);
    mean_diameters = mean(diameter(filter_selection));
    mean_weights = mean(weight(filter_selection));
end

plot(mean_diameters, mean_weights);

如果直径范围由一组跨越整个数据集的边缘定义,这可以通过

轻松完成
  • histcounts 对范围内的直径进行分类,然后
  • accumarray 将函数应用于直径或每个直径范围的权重。
diameters = [4 7 2 8 7 9 6 4 6 8 4 3];
weights = [10 40 50 40 30 60 70 80 90 40 20 60];
edges = [2 4 6 8 10]; % first range is [edges(1), edges(2)),
                      % second is [edges(2), edges(3)), ...,
                      % last is [edges(end), inf]
[~, ~, ind] = histcounts(diameters, [edges inf]);
result_diameters = accumarray(ind(:), diameters(:), size(edges(:)), @mean, NaN);
result_weights = accumarray(ind(:), weights(:), size(edges(:)), @mean, NaN);

例如,这给出了

result_weights =
  55.000000000000000
  36.666666666666664
  57.500000000000000
  46.666666666666664
                 NaN

result_weights(1)55,是直径在[2,4)范围内的两个值的平均权重,即第三个和最后一个数据值。 result_weights(5)NaN,因为 [10inf].

范围内没有值