2010-02-04 34 views
7

Có hàm Mathematica cung cấp kết quả tương đương với hàm unique() trong MATLAB không? Tôi nhận ra rằng tôi có thể sử dụng hàm Union[] để lấy các phần tử duy nhất của danh sách, nhưng tôi muốn một cái gì đó tương đương với phiên bản ba kết quả của hàm cung cấp các mảng chỉ mục ánh xạ giữa mảng đầu vào và mảng giá trị duy nhất.Mathematica có hàm tương đương với hàm "duy nhất" của Matlab

Nếu không có gì được tích hợp, có triển khai chức năng đó ở đâu đó không? Có ai ở đây biết cách xây dựng nó không?

Trả lời

8

Bạn có thể dễ dàng xây dựng chức năng tương tự cho mình với Mathematica Position[]. Ví dụ. được cung cấp danh sách các số bạn có thể làm như sau:

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

để lấy danh sách các phần tử duy nhất và chỉ mục xuất hiện trong danh sách gốc. Để tái tạo chính xác các chức năng của Matlab của Unique(), đặc biệt đối với

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

bạn cần

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

mà hiện nay cung cấp các hành vi mong muốn

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

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

Đó chính xác là những gì tôi đang tìm kiếm. Tôi đã quên tất cả về Vị trí [] và không tìm thấy nó khi duyệt tài liệu. Cảm ơn đã giúp đỡ! – clartaq

+1

Một điều cần xem xét là 'Liên minh' sẽ sắp xếp danh sách đầu vào. Nếu bạn không muốn điều đó xảy ra, hãy sử dụng 'DeleteDuplicates'. 'DeleteDuplicates' cũng có xu hướng nhanh hơn đáng kể cho các đầu vào lớn. – Pillsy

+0

Cảm ơn lời khuyên, tôi sẽ phải làm một số thử nghiệm, nhưng đó có thể là một cải tiến tốt trong một dự án của tôi. – Timo

1

Hãy thử Length[Union[x]]. If x=[1,0,1,1,1], sau đó bạn sẽ nhận được Length[Union[x]] = 2.

1

Có một cách đơn giản:

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} 
Các vấn đề liên quan