私は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'
_
[〜#〜] 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'
MATLAB R2012aでは、新しい order flag が追加されました:
>> y = {'d' 'f' 'a' 'g' 'g' 'a' 'w' 'h'};
>> unique(y, 'stable')
ans =
'd' 'f' 'a' 'g' 'w' 'h'
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)