根据为 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
,因为 [10
、inf
].
范围内没有值
我有两个 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
,因为 [10
、inf
].