# In an array xy=[x y], reduce array length by assigning average values of y based on a predefined range of x

2 views (last 30 days)
Saeid on 23 May 2023
Commented: Dyuman Joshi on 24 May 2023
I have the x values in the range x=[x1 ... xn] and y values related to x through the function f as in y=f(x). Now I want to break down down the y array to a smaller array Y in that I first find all values related to x in the range x1>x>x0 and then calculate the mean of y values whose corresponding x's are in this range. Then I move on to the next range which is x2>x>x1 and calculate the mean of the corresponding y values and so on. At the end, this will look like converting a xy larger dataset to a smaller one, as shown in the picture. Since this is usually a really large dataset, I'd rather do this without a loop.

Steven Lord on 24 May 2023
Use findgroups or discretize to bin your X data into groups then use splitapply or groupsummary to calculate the @mean for each of those groups.
Dyuman Joshi on 24 May 2023
This is neat. Though I found it difficult to implement the other pair - findgroups with groupsummary.
x = [(1:20)' randi(50,20,1)];
disp(x)
1 46 2 7 3 40 4 41 5 34 6 8 7 38 8 34 9 46 10 21 11 8 12 3 13 47 14 46 15 4 16 31 17 11 18 42 19 21 20 21
%Defining range of values
idx = [1 4 8 12 16 20];
out = discretize(x(:,1),idx);
splitapply(@mean, x(:,2), out)
ans = 5×1
31.0000 30.2500 27.2500 25.0000 25.2000

### Categories

Find more on Resizing and Reshaping Matrices in Help Center and File Exchange

R2023a

### Community Treasure Hunt

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

Start Hunting!