2017-10-02 5 views
0

のアレイ内で複数回現れる要素を削除します。複数回表示されるすべての要素は、任意の一般的なケース、すなわち、任意の計算努力せずに、最も簡単な方法で除去することができる方法完全以下の配列を指定してのMatlab

A=[1,2,3,4,5,6,7,8,9,2,4,5,8,4,6,7,1,2,8,5,14,100,101]; 

、取得する:

A=[3,9,14,100,101]; 
+0

Iは、異なる方法を比較するために、[ベンチマーク](https://stackoverflow.com/a/46531458/7621674)を加えました。 – m7913d

答えて

3

をあなたは、単に行うことができます:以来

res = A(sum(A==A') == 1) % keep elements whose frequency is exactly 1 
> res = 
3  9 14 100 101 

をは、各要素の頻度を返します。

+1

'''は転置されません。複素共役転置です。 '.''は転置です –

+0

このメソッドはMATLAB R2016b以降でのみ有効です。このメソッドに従うと、すべてのバージョンに適した' bsxfun'を使用して代替回答を追加しました。 – Wolfie

+0

このアプローチは大きな問題では非常に遅いですが、実際には元の順序を保持しています。詳細については、[my benchmark](https://stackoverflow.com/questions/40393513/eliminate-remove-duplicates-from-array-matlab/46531458#46531458)を参照してください。 – m7913d

0

あなたはまず、あなたの要素を並べ替えると、次のようにその後隣国の一つとして同じ値を持つすべての要素を削除することができます:あなたが使用することができ2016Bより前のバージョンでは

A_sorted = sort(A); % sort elements 
A_diff = diff(A_sorted)~=0; % check if element is the different from the next one 
A_unique = [A_diff true] & [true A_diff]; % check if element is different from previous and next one 
A = A_sorted(A_unique); % obtain the unique elements. 
+1

最後の要素もこの方法でソートされます。 –

0

は(implicit expansion前の事になりました)暗黙的な拡張を使用するJean's resultを模倣するbsxfun

out = A(sum(bsxfun(@(x,y) x==y, A, A.'))==1) 

>> out = [3 9 14 100 101] 
関連する問題