2010-02-04 15 views
7

¿Hay una función de Mathematica que proporcione resultados equivalentes a la función unique() en MATLAB? Me doy cuenta de que podría usar la función Union[] para obtener los elementos únicos de una lista, pero me gustaría algo equivalente a la versión de tres resultados de la función que proporciona matrices de índice que mapean entre la matriz de entrada y la matriz de valores únicos.Tiene Mathematica una función equivalente a la función "única" de Matlab

Si no hay nada incorporado, ¿hay alguna implementación de esa función disponible en alguna parte? ¿Alguien aquí sabe cómo construirlo?

Respuesta

8

Puede crear fácilmente una funcionalidad similar usted mismo con Mathematica's Position[]. P.ej. dado una lista de números que podría hacer lo siguiente:

In[1] := A = {1, 5, 2, 3, 7, 3, 2, 8, 6, 5, 9, 2, 1}; 
In[2] := {#, Flatten[Position[A, #]]} & /@ Union[A] 
Out[2]:= {{1, {1, 13}}, {2, {3, 7, 12}}, {3, {4, 6}}, {5, {2, 10}}, {6, {9}}, {7, {5}}, {8, {8}}, {9, {11}}} 

para obtener la lista de elementos únicos y los índices de dónde aparecen en la lista original. Para replicar exactamente la funcionalidad de Matlab de Unique(), especialmente para

[b,m,n] = unique(A) 

necesita

b = Union[A]; 
m = Last[Position[A, #]] & /@ b // Flatten; 
n = Position[b, #] & /@ A // Flatten; 

que ahora proporcionan el comportamiento deseado

In[1] := A[[#]] & /@ m == b 
Out[1]:= True 

In[2] := b[[#]] & /@ n == A 
Out[2]:= True 
+0

eso es exactamente lo que estaba buscando. Me olvidé por completo de la Posición [] y no la encontré de nuevo cuando busqué en la documentación. ¡Gracias por la ayuda! – clartaq

+1

Una cosa a considerar es que 'Union' clasificará la lista de entrada. Si no quiere que eso suceda, use 'DeleteDuplicates'. 'DeleteDuplicates' también tiende a ser sustancialmente más rápido para grandes entradas. – Pillsy

+0

Gracias por la sugerencia, tendré que hacer algunas pruebas, pero eso probablemente será una buena mejora en un proyecto mío. – Timo

1

Trate Length[Union[x]]. If x=[1,0,1,1,1], luego obtendrá Length[Union[x]] = 2.

1

Hay una manera simple:

a={1,2,3,4,5,5,5,4,3,2} 

    {1,2,3,4,5,5,5,4,3,2} 

uniques = DeleteDuplicates[a] 

    {1,2,3,4,5} 
Cuestiones relacionadas