Есть ли в Mathematica функция, эквивалентная уникальной функции Matlab?

Существует ли функция Mathematica, которая дает результаты, эквивалентные функции unique() в MATLAB? Я понимаю, что мог бы использовать функцию Union[] для получения уникальных элементов списка, но я хотел бы что-то эквивалентное версии функции с тремя результатами, которая предоставляет массивы индексов, которые сопоставляются между входным массивом и массивом уникальных значений.

Если нет ничего встроенного, есть ли где-нибудь реализация этой функции? Кто-нибудь здесь знает, как его построить?


person clartaq    schedule 04.02.2010    source источник


Ответы (3)


Вы можете легко создать аналогичную функциональность самостоятельно с помощью Mathematica Position[]. Например. учитывая список чисел, вы можете сделать следующее:

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}}}

чтобы получить список уникальных элементов и индексы их появления в исходном списке. Чтобы точно воспроизвести функциональность Matlab Unique(), специально для

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

тебе нужно

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

которые теперь обеспечивают желаемое поведение

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

In[2] := b[[#]] & /@ n == A
Out[2]:= True
person Timo    schedule 05.02.2010
comment
Это именно то, что я искал. Я совсем забыл о Position[] и не нашел его снова при просмотре документации. Спасибо за помощь! - person clartaq; 05.02.2010
comment
Следует учитывать, что Union будет сортировать входной список. Если вы не хотите, чтобы это произошло, используйте DeleteDuplicates. DeleteDuplicates также имеет тенденцию быть значительно быстрее для больших входных данных. - person Pillsy; 08.02.2010
comment
Спасибо за совет, мне нужно провести некоторое тестирование, но это, вероятно, будет хорошим улучшением в моем проекте. - person Timo; 09.02.2010

Попробуйте Length[Union[x]]. If x=[1,0,1,1,1], то вы получите Length[Union[x]] = 2.

person Cambise Homa    schedule 08.11.2014

Есть простой способ:

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}
person earnric    schedule 09.03.2017