2010-06-17 20 views
24

que tienen esta matriz celular en MATLAB:¿Cómo puedo eliminar duplicados en una matriz pero mantener el mismo orden?

y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'} 

utilizo unique(y) para deshacerse de los duplicados pero reordena las cadenas en orden alfabético:

>> unique(y) 

ans = 

'a' 'd' 'f' 'g' 'h' 'w' 

Quiero eliminar los duplicados, pero mantener el mismo orden Sé que podría escribir una función, pero hago esta pregunta, pero me preguntaba si había una forma más sencilla de usar el unique para eliminar duplicados y mantener el mismo orden solo con los duplicados eliminados.

Quiero que vuelva esto:

>> unique(y) 

ans = 

'd' 'f' 'a' 'g' 'w' 'h' 
+2

supongo que la respuesta dada por Amro es la mejor manera de lograr esto ahora. 'unique (y, 'stable')' –

Respuesta

27

Aquí hay una solución que utiliza algunos de los argumentos de entrada y salida adicionales que UNIQUE tiene:

>> y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}; %# Sample data 
>> [~,index] = unique(y,'first');  %# Capture the index, ignore the actual values 
>> y(sort(index))       %# Index y with the sorted index 

ans = 

    'd' 'f' 'a' 'g' 'w' 'h' 
+2

Ahora, ¿por qué no pensé en hacerlo de esta manera? +1 – Doresoom

+0

+1: Ya tengo una función en mi camino llamada 'uniq.m' que hace esto exactamente, la uso todo el tiempo :) – Amro

6

Si nos fijamos en la documentación de unique, hay la opción de devolver un índice junto con el arreglo ordenado. También puede especificar si desea que la primera o la última aparición de un número se devuelva al índice.

Por ejemplo:

a=[5, 3, 4, 2, 1, 5, 4]; 

[b,order]=unique(a,'first') 

vuelve

b=[1, 2, 3, 4, 5] y m=[5, 4, 2, 3, 1]

Puede ordenar la matriz de orden y almacenar el índice siguiente

[~,index]=sort(order) %# use a throw-away variable instead of ~ for older versions 

y, finalmente, volver a indexar b

b=b(index) 
+0

+1: Parece que revisamos nuestras respuestas al mismo tiempo. – gnovice

21

En MATLAB R2012a, se añadió un nuevo order flag:

>> y = {'d' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}; 
>> unique(y, 'stable') 
ans = 
    'd' 'f' 'a' 'g' 'w' 'h' 
Cuestiones relacionadas