Find the median of sequential duplicate entries
2 views (last 30 days)
Show older comments
Hi! So I have a matrix
num =
1 4
2 4
3 4
4 4
5 5
6 6
7 6
8 6
9 6
10 6
11 7
....
31 14
32 14
33 13
34 12
35 12
36 12
37 12
38 12
39 9
40 9
41 9
42 9
43 8
44 8
45 8
46 8
47 5
48 5
49 4
50 3
And I want to take the median of the x entries with sequential y entries that are duplicate such that
inum =
2.5 4
5 5
8 6
11 7
....
31.5 14
33 13
36 12
40.5 9
44.5 8
47.5 5
49 4
50 3
I am using unique such that
[C,ia,ic] = unique(num(:,2),'stable')
OutMatrix = [accumarray(ic, num(:,1), [], @median ) ,C];
However, my outmatrix is showing the median of all the x entries that have y values that are the same i.e It took the median of 1,2,3,4,49 and not the median on 1,2,3,4 and 49 How do I do this? Thanks
0 Comments
Accepted Answer
Cedric
on 24 May 2014
Edited: Cedric
on 24 May 2014
One way to achieve this is to replace num(:,2) with a monotonically increasing group/block ID that you build. Here is how:
blockStart = [true; diff(num(:,2)) ~= 0] ;
blockId = cumsum( blockStart ) ;
applied to the numbers that you gave, this builds the 3rd column below;
>> [num, blockId]
ans =
1 4 1
2 4 1
3 4 1
4 4 1
5 5 2
6 6 3
7 6 3
8 6 3
9 6 3
10 6 3
11 7 4
31 14 5
32 14 5
33 13 6
34 12 7
35 12 7
36 12 7
37 12 7
38 12 7
39 9 8
40 9 8
41 9 8
42 9 8
43 8 9
44 8 9
45 8 9
46 8 9
47 5 10
48 5 10
49 4 11
50 3 12
and you can see that, using this, you eliminate the interference between blocks with same num(:,2) on both sides of the peak. Then you perform the call to ACCUMARRAY that you already implemented, using blockId this time:
>> OutMatrix = [accumarray( blockId, num(:,1), [], @median ), ...
num(blockStart,2)]
OutMatrix =
2.5000 4.0000
5.0000 5.0000
8.0000 6.0000
11.0000 7.0000
31.5000 14.0000
33.0000 13.0000
36.0000 12.0000
40.5000 9.0000
44.5000 8.0000
47.5000 5.0000
49.0000 4.0000
50.0000 3.0000
More Answers (1)
Image Analyst
on 24 May 2014
Do you have the Image Processing Toolbox? It's not too hard if you do - just use regionprops(). Let me know if you want to use that approach.
0 Comments
See Also
Categories
Find more on Logical 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!