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



我有两个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)); 

如果直径范围是由一组跨越整个数据集的边定义的,则可以很容易地使用

  • 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,因为在[10,inf]范围内没有值。

subarray1是一个逻辑数组,告诉您选择哪些元素来满足您的条件。就像你在diameter中使用逻辑索引来选择范围内的直径一样,你可以在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);

相关内容

  • 没有找到相关文章

最新更新