Return all unique rows with unique elements
Show older comments
How would I find all rows of a matrix which contain only unique elements? For example, if I have a matrix containing all 3-way combinations of the numbers 1-3:
>> x = allcomb(1:3, 1:3, 1:3)
x =
1 1 1
1 1 2
1 1 3
1 2 1
1 2 2
1 2 3
1 3 1
1 3 2
1 3 3
2 1 1
2 1 2
2 1 3
2 2 1
2 2 2
2 2 3
2 3 1
2 3 2
2 3 3
3 1 1
3 1 2
3 1 3
3 2 1
3 2 2
3 2 3
3 3 1
3 3 2
3 3 3
I could do the following:
y = unique(sort(x, 2), 'rows');
y(y(:,1) == y(:,2) | y(:,1) == y(:,3) | y(:,2) == y(:,3), :) = [];
But is there a more efficient way to accomplish this for matrices with an arbitrary number of columns?
Thanks, Dan
Accepted Answer
More Answers (3)
Andrei Bobrov
on 28 Sep 2011
variant (edited 09/28/2011 13:00 MDT)
xu = unique(x);
[~,loc] = ismember(x,xu);
[a,b] = unique(sort(loc,2),'rows','first');
out = x(b(all(diff(a,1,2),2)),:);
variant 2
[xu,b] = unique(sort(x,2),'rows')
out = x(sort(b(all(diff(xu,1,2),2))),:)
Daniel
on 28 Sep 2011
Jan
on 28 Sep 2011
No need for the time-consuming UNIQUE:
x = allcomb(1:3, 1:3, 1:3);
index = all(diff(sort(x, 2), 1, 2), 2);
y = x(index, :);
Categories
Find more on Creating and Concatenating 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!