views:

61

answers:

4

Hi,

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 :-)

+3  A: 

To quote from the documentation:

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

Is that what you want ?

High Performance Mark
+5  A: 

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');
Martin B
+1  A: 

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

Sanjay Manohar
+3  A: 

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
Adrian