2010-02-04 119 views
7

Mathematica函數是否提供了等效於MATLAB中unique()函數的結果?我意識到我可以使用Union[]函數來獲取列表的唯一元素,但我希望能夠提供與提供索引數組的函數的三個結果版本相同的東西,該索引數組可以在輸入數組和唯一值數組之間進行映射。Mathematica是否具有與Matlab的「獨特」功能等效的功能

如果沒有內置任何內容,那麼該函數的某個實現是否可用?這裏有人知道如何建立它嗎?

回答

8

您可以使用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 
+0

這正是我一直在尋找。我忘記了位置[]的所有信息,並且在瀏覽文檔時沒有再次找到它。謝謝您的幫助! – clartaq 2010-02-05 14:11:40

+1

有一點需要考慮的是'Union'會對輸入列表進行排序。如果你不希望發生這種情況,請使用'DeleteDuplicates'。對於大型輸入,「DeleteDuplicates」也往往快得多。 – Pillsy 2010-02-08 20:45:42

+0

感謝您的提示,我將不得不做一些測試,但這可能會改善我的一個項目。 – Timo 2010-02-08 21:07:29

1

嘗試Length[Union[x]]If x=[1,0,1,1,1],那麼你會得到Length[Union[x]] = 2

1

有一個簡單的方法:

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} 
相關問題