Return all unique rows with unique elements

6 Ansichten (letzte 30 Tage)
Daniel
Daniel am 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

Akzeptierte Antwort

Daniel
Daniel am 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.]

Weitere Antworten (3)

Andrei Bobrov
Andrei Bobrov am 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 am 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 am 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, :);

Kategorien

Mehr zu Structures finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by