开发者

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

开发者 https://www.devze.com 2023-01-07 22:50 出处:网络
I have an array comprising n rows and 4 colums. Each of the four entries开发者_JS百科 on the row is an integer, i.e.,

I have an array comprising n rows and 4 colums. Each of the four entries开发者_JS百科 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

0

精彩评论

暂无评论...
验证码 换一张
取 消