How to find rows with multiple entries that are equal?

1 view (last 30 days)
I have a NxM matrix and I want to find the rows that have M-1 duplicate entries. For example:
A=[1 1 2 4;
2 2 2 1;
2 9 3 0;
3 0 3 3;
4 3 2 2];
fun(A);
ans = [2 2 2 1;
3 0 3 3]
How could I do this, preferably elegantly in a few lines? I am trying to avoid loops because I anticipate working with large matrices eventually.

Accepted Answer

Kirby Fears
Kirby Fears on 6 Oct 2015
Edited: Kirby Fears on 6 Oct 2015
In two lines:
sA=sort(A,2);
A(sum(sA(:,2:end)==sA(:,1:end-1),2)==size(sA,2)-2,:)
ans =
2 2 2 1
3 0 3 3
Here's another method that doesn't use sort(). It's slightly faster for large matrices on my machine:
rowIdx=(sum(repmat(A(:,1),1,size(A,2))~=A,2)==1) | ...
(sum(repmat(A(:,2),1,size(A,2))~=A,2)==1);
A=A(rowIdx,:);
You might want to break that down into more lines of code for readability.
Hope this helps.

More Answers (2)

the cyclist
the cyclist on 6 Oct 2015
Edited: the cyclist on 6 Oct 2015
A(sum(diff([nan(size(A,1),1),sort(A,2)],1,2)==0,2)==(size(A,2)-2),:)

Andrei Bobrov
Andrei Bobrov on 6 Oct 2015
out = A(any(hist(A')==3),:);
  1 Comment
Colton
Colton on 6 Oct 2015
Edited: Colton on 6 Oct 2015
Thank you. Needs the correction below though.
M=size(A,2);
out= A(~any(hist(A')==(M),:);

Sign in to comment.

Categories

Find more on Data Type Identification in Help Center and File Exchange

Products

Community Treasure Hunt

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

Start Hunting!