2010-07-15 5 views
2

J'ai un tableau comprenant n lignes et 4 colonnes. Chacune des quatre entrées de la rangée est un nombre entier, à savoirComment puis-je trouver des lignes uniques dans une matrice, sans ordre d'éléments dans chaque rangée?

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

    ]; 

Chaque ligne représente les sommets d'un tétraèdre. Ces sommets n'ont donc aucune directivité, dans le cas ci-dessus, les tétraèdres représentés par X (1, ​​:) et X (3, :) sont équivalents. Je souhaite supprimer les tétraèdres en double de X, mais je n'arrive pas à comprendre comment incorporer l'indépendance de la commande dans mon code.

J'ai essayé la fonction UNIQUE() mais retourne un (NX1) tableau d'entiers uniques, à savoir,

Y = UNIQUE(X); 

Y = [ 
    2 
    6 
    9 
    111 
    112 
    115 
    432 
    ] 

Quelqu'un a des suggestions pour un moyen raisonnablement efficace pour accomplir cette tâche?

Merci, S :-)

Répondre

9

d'abord, trier les lignes de votre matrice pour arriver à une représentation « canonique » pour tétraèdres:

X = sort(X, 2); 

Ensuite, utilisez unique avec l'argument 'rows' en option pour trouver des lignes uniques:

Y = unique(X, 'rows'); 
3

Voici un extrait de la documentation:

b = unique, (A, 'lignes') renvoie les lignes uniques de A.

Est-ce ce que vous voulez?

1

vous devez d'abord trier les lignes, puis utiliser unique (A, 'rows') comme HPM suggère

5

unique() fonctionnera sur les lignes, mais les lignes 1 et 3 sont un ordre différent. Nous pourrions donc les trier avant d'utiliser unique.

Y=unique(sort(X,2),'rows') 

Y = 

    2 111 112 432 
    6  9 111 115 

Si vous souhaitez conserver la commande originale alors unique retournera les indices

[Y,yi]=unique(sort(X,2),'rows'); 

>> X(yi,:) 

ans = 

    112 432 111  2 
    6  9 115 111 
Questions connexes