Removing rows that are not unique from an array?
24 ビュー (過去 30 日間)
古いコメントを表示
Is there an easy way to remove ALL rows that are NOT unique? For example, how would I get B from A?
A = [1 2; 1 3; 1 4; 1 2; 1 5];
B = [1 3; 1 4; 1 5];
I could do this in a loop, but there seems like there must be a more elegant way. I've looked at various applications in the forum using the unique() function, but a solution is not obvious to me.
Thanks!
0 件のコメント
採用された回答
Star Strider
2017 年 7 月 7 日
This works:
A = [1 2; 1 3; 1 4; 1 2; 1 5];
[~,ia,ic] = unique(A, 'rows'); % Unique Elements
v = accumarray(ic, 1); % Tally Occurrences Of Rows
B = A(ia(v==1),:) % Keep Rows That Only Appear Once
B =
1 3
1 4
1 5
5 件のコメント
その他の回答 (1 件)
Jan
2017 年 7 月 7 日
編集済み: Jan
2017 年 7 月 8 日
As = sortrows(A);
k = find([true; any(diff(As, 1, 1), 2); true]);
B = As(k(diff(k) == 1), :);
And if the original order is wanted:
[As, idx1] = sortrows(A);
k = find([true; any(diff(As, 1, 1), 2); true]);
idx2 = k(diff(k) == 1);
B = A(idx1(idx2), :);
For A = randi([1, 20], 1e5, 4) the first method is 15% faster than the unique/accumarray method.
3 件のコメント
Image Analyst
2017 年 7 月 8 日
This is asked so often it should be in the FAQ. But before I do, I'd like to have a solution to the other case people ask a lot about, and that is where people want to keep the first instance of the duplicate row (along with unique rows), rather than toss out all rows that are members of duplicates. Another case might be to keep only the duplicate rows.
参考
カテゴリ
Help Center および File Exchange で Startup and Shutdown についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!