Tutorial :How can I find unique rows in a matrix, with no element order within each row?


I have an array comprising n rows and 4 colums. Each of the four entries on the row is an integer, i.e.,

X = [         111 112 432   2           6   9 115 111         112 432 111   2        ];   

Each row represents the vertices of a tetrahedron. These vertices have no directionality thus, in the case above, the tetrahedra represented by X(1,:) and X(3,:) are equivalent.

I wish to remove duplicate tetrahedra from X, but can't quite figure how to incorporate the order independence into my code.

I tried the UNIQUE() function but this returns a (nx1) array of unique integers, i.e.,

Y = UNIQUE(X);    Y = [       2       6       9       111       112       115       432      ]  

Anyone have any suggestions for a reasonably efficient way to complete this task?

Thanks, S :-)


First, sort the rows of your matrix to arrive at a "canonical" representation for the tetrahedra:

X = sort(X, 2);  

Then, use unique with the optional 'rows' argument to find unique rows:

Y = unique(X, 'rows');  


unique() will work on rows, but rows 1 and 3 are a different order. So we could sort them prior to using unique.

Y=unique(sort(X,2),'rows')    Y =         2   111   112   432       6     9   111   115  

If you want to retain the original ordering then unique will return the indices

[Y,yi]=unique(sort(X,2),'rows');    >> X(yi,:)    ans =       112   432   111     2       6     9   115   111  


To quote from the documentation:

b = unique(A, 'rows') returns the unique rows of A.

Is that what you want ?


you should sort the rows first, then use unique(A,'rows') as HPM suggests

Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Next Post »