MATLAB Answers

Selecting min value per row unless min value is repeated in another row.

4 views (last 30 days)
Hi, I have a matrix of values shown below. I want to keep the lower value in each row, unless that lower value is repeated in another row of the matrix. For the matrix shown below, the retained values should be 7, 9, 14, 22, 24, 27, 29, 35, 30, 34, 38, and 44. My first thought was the unique function, but that then prevents me from selecting the min value per row. Thanks in advance for the help.
A = [1 2
1 3
2 3
5 6
3 7
2 8
3 8
8 9
5 10
6 10
10 12
11 13
12 15
11 16
13 16
15 20
14 21
22 28
24 31
20 32
27 33
29 34
32 35
30 36
34 42
38 43
40 48
40 49
48 49
44 50];

  0 Comments

Sign in to comment.

Accepted Answer

Stephen Cobeldick
Stephen Cobeldick on 24 Jan 2020
Edited: Stephen Cobeldick on 24 Jan 2020
Set the duplicate values to Inf/NaN, take the minimum of each row, then remove the Inf/NaN values:
>> A = [1,2;1,3;2,3;5,6;3,7;2,8;3,8;8,9;5,10;6,10;10,12;11,13;12,15;11,16;13,16;15,20;14,21;22,28;24,31;20,32;27,33;29,34;32,35;30,36;34,42;38,43;40,48;40,49;48,49;44,50];
>> U = unique(A(:));
>> A(ismember(A,U(histc(A(:),U)>1))) = Inf; % duplicate values -> Inf.
>> V = min(A,[],2);
>> V = V(isfinite(V)) % remove Inf.
V =
7
9
14
22
24
27
29
35
30
42
38
44
This differs from your example output (which contains 34 instead of 42, even though 34 occurs twice).

  4 Comments

Show 1 older comment
Vance Blake
Vance Blake on 24 Jan 2020
If I wanted to include the right bin edge how would I modify the histcounts function using 'edges'? I have numbers that range from 1 to 50, but 50 keeps being ignored currently if it occurs in 2 separate rows.
Stephen Cobeldick
Stephen Cobeldick on 25 Jan 2020
Reading the histc and histcounts documentation it is clear that unfortunately histcounts treats the right edge of the last bin very differently to histc, namely:
  • histc: "The last bin consists of the scalar value equal to last value in binranges."
  • histcounts: "The last bin also includes the right bin edge..."
So the solution is to define the last bin's right edge as not equal to any of your data, e.g. Inf:
>> A = [1,2;1,3;2,3;5,6;3,7;2,8;3,8;8,9;5,10;6,50;50,12]
A =
1 2
1 3
2 3
5 6
3 7
2 8
3 8
8 9
5 10
6 50
50 12
>> U = [unique(A(:));Inf]; % force last bin to only include last unique value
>> A(ismember(A,U(histcounts(A(:),U)>1))) = NaN; % duplicate values -> NaN.
>> V = min(A,[],2);
>> V = V(isfinite(V)) % remove NaN.
V =
7
9
10
12
Vance Blake
Vance Blake on 25 Jan 2020
Okay I see what you mean. Thank you for clearing that up. Just wondering but why does Mathworks not recommend histc then?? It seems like the legacy fucntion is more useful than histcounts.

Sign in to comment.

More Answers (0)

Sign in to answer this question.


Translated by