Please help with using accumarray to choose the max value of the array
Show older comments
I have a matrix, for an example with 11 x 3.
CH BA OL
10.0000 10.0000 0.6000
10.0000 11.0000 0.4000
11.0000 9.0000 0.6000
11.0000 10.0000 0.2000
11.0000 11.0000 0.2000
25.0000 44.0000 0.1000
25.0000 9.0000 0.7000
25.0000 45.0000 0.2000
27.0000 44.0000 0.2000
27.0000 46.0000 0.3000
27.0000 9.0000 0.5000
I'm trying to take unique values for column CH, and each unique value in CH should sort the maximum value's BA. For example, final results should be like
CH BA OL
10 10 0.6
11 9 0.6
25 9 0.7
27 46 0.5
I was trying accumarray but I couldnt get the correct answer. Please help
4 Comments
Ameer Hamza
on 18 Mar 2020
Edited: Ameer Hamza
on 18 Mar 2020
Can you recheck the output matrix? Whether you want the minimum or maximum value from the column BA?
Hashini Wanniarachchi
on 18 Mar 2020
Ameer Hamza
on 18 Mar 2020
In that case, last row should be 27 9 0.5
Hashini Wanniarachchi
on 18 Mar 2020
Answers (2)
Mohammad Sami
on 18 Mar 2020
% matrix = 11 x 3
ch = matrix(:,1);
[u,~,ic] = unique(ch);
maxba = accumarray(ic,matrix(:,2),[],@max);
out = [u maxba];
i = ismember(matrix(:,1:2),out,'rows');
out = matrix(i,:);
1 Comment
Hashini Wanniarachchi
on 18 Mar 2020
Ameer Hamza
on 18 Mar 2020
Edited: Ameer Hamza
on 18 Mar 2020
Try this
M = [10.0000 10.0000 0.6000
10.0000 11.0000 0.4000
11.0000 9.0000 0.6000
11.0000 10.0000 0.2000
11.0000 11.0000 0.2000
25.0000 44.0000 0.1000
25.0000 9.0000 0.7000
25.0000 45.0000 0.2000
27.0000 44.0000 0.2000
27.0000 46.0000 0.3000
27.0000 9.0000 0.5000];
[~,idx] = sort(M(:,3));
M = M(idx,:);
[~,idx] = sort(M(:,1));
M = M(idx,:);
result = splitapply(@(x) x(end,:), M, findgroups(M(:,1)));
1 Comment
Hashini Wanniarachchi
on 18 Mar 2020
Categories
Find more on Shifting and Sorting Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!