Take mean value when elements inside array "clump up"

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 Comments

So, in this case, you want the output to be
out = [1; 10; 15; 16.15; 18];
?
Im actually only interested in the mean value, the array is non of my concern anymore.
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];
?

Sign in to comment.

 Accepted Answer

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 Comments

Thanks a lot for your anwer!
Is there a way to then extract all the mean values calculated?
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);
Thank you kind sir! I

Sign in to comment.

More Answers (0)

Categories

Tags

Asked:

on 27 Jul 2020

Commented:

on 28 Jul 2020

Community Treasure Hunt

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

Start Hunting!