Return all unique rows with unique elements

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

 Réponse acceptée

Daniel
Daniel le 28 Sep 2011
@andrei:
This does not work because it returns several rows which contain the same element. What I am looking for is a matrix of rows which only contain unique elements. In the above example, this is a single row [1 2 3], but in principle could be much larger. As an example, consider the following:
x = allcomb(1:5, 1:5, 1:5);
y = unique(sort(x, 2), 'rows');
y(y(:,1) == y(:,2) | y(:,1) == y(:,3) | y(:,2) == y(:,3), :) = []
Thanks, Dan
[I accidentally hit the accept this answer button. Please disregard.]

Plus de réponses (3)

Andrei Bobrov
Andrei Bobrov le 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
Daniel le 28 Sep 2011
@andrei:
Ah, the last line should be:
out = x(b(all(diff(a,1,2),2), :), :);
That does it! Thanks!!
Jan
Jan le 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, :);

Catégories

En savoir plus sur Text Analytics Toolbox dans Centre d'aide et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by