Take mean value when elements inside array "clump up"

3 次查看(过去 30 天)
I have an Array,for example:
r1 = rand(1000,1)
sort(r1)
and have this sorted in ascending order. What Im trying to accomplish is: I want to take the mean value whenever the values inside the arrays clump up and are in between a specific threshold. Trying to explain this in an example:
a = [1; 10; 15; 16; 16.1; 16.2; 16.3; 18]
Mean Value should always be taken when the number inside the array have a maximum difference of 0.5.
So here essentially this should be taken:
a_sub = [16; 16.1; 16.2; 16.3]
mean(a_sub)
I hope this is understandable. Any help is greatly appreciated.
  4 个评论
the cyclist
the cyclist 2020-7-27
Could there be more than one cluster in the same array? For example, could the input be something like
a = [0.1 0.2 0.3 5 6 7 0.8 0.9 1.0];
?

请先登录,再进行评论。

采纳的回答

the cyclist
the cyclist 2020-7-27
编辑:the cyclist 2020-7-27
Assuming that my guess about the correct output is correct, then the following should work.
% Original (sorted) data
a = [1; 10; 15; 16; 16.1; 16.2; 16.3; 18];
% The difference threshold
d = 0.5;
% Identify which "cluster" each value belongs to. This part is slightly tricky.
% The diff command will result in a value of 1 if the prior value is more than the threshold.
% By taking the cumulative sum, the index will therefore move to the next value.
clusterIndex = cumsum(diff([a(1); a]) > d) + 1;
% According to the index, take the mean over values that belong to the same cluster
out = accumarray(clusterIndex,a,[],@mean);
  3 个评论
the cyclist
the cyclist 2020-7-28
a = [1; 2.1; 2.2; 10; 15; 16; 16.1; 16.2; 16.3; 18];
d = 0.5;
clusterIndex = cumsum(diff([a(1); a]) > d) + 1;
numberInCluster = histcounts(clusterIndex);
clusterMeans = accumarray(clusterIndex,a,[],@mean);
clusterMeansWithMoreThanOneValue = clusterMeans(numberInCluster>1);

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Shifting and Sorting Matrices 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by