Return all unique rows with unique elements

6 vues (au cours des 30 derniers jours)
Daniel
Daniel le 28 Sep 2011
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 Structures dans Help Center et File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by