web-dev-qa-db-ja.com

配列内の重複を削除して同じ順序を維持するにはどうすればよいですか?

私はMATLABにこのセル配列を持っています:

_y = { 'd' 'f' 'a' 'g' 'g' 'a' 'w' 'h'}
_

重複を取り除くためにunique(y)を使用しますが、文字列をアルファベット順に並べ替えます。

_>> unique(y)

ans =

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

重複を削除したいが、同じ順序を維持したい。私はこれを行う関数を書くことができることを知っていますが、重複を削除するだけで同じ順序を保ちながらuniqueを使用して重複を削除する簡単な方法があるかどうか疑問に思っていました。

私はこれを返したい:

_>> unique(y)

ans = 

'd'    'f'    'a'    'g'    'w'    'h'
_
25
Ben Fossen

[〜#〜] unique [〜#〜] が持つ追加の入力引数と出力引数を使用する1つのソリューションを次に示します。

>> 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'
28
gnovice

MATLAB R2012aで​​は、新しい order flag が追加されました:

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

unique のドキュメントを見ると、ソートされた配列とともにインデックスを返すオプションがあります。数値の最初または最後のオカレンスをインデックスに返すかどうかも指定できます。

例えば:

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

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

戻り値

b=[1, 2, 3, 4, 5]およびm=[5, 4, 2, 3, 1]

次に注文配列を並べ替え、インデックスを保存できます

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

そして最後にbを再インデックスします

b=b(index)
6
Doresoom