Vectorized alterlative to identify duplicate elements in an array
4 ビュー (過去 30 日間)
古いコメントを表示
Hello everyone,
I have a 1xN array, A, of random integers. Repetitions are permitted. Let's consider only the integers 1:5 to make things simple:
A = [1, 5, 3, 4, 4, 2, 3, 1, 4, 5, 3, 2, 3, 4, 2, 3];
I generate a second 1xN array, B, which represents an arbitrary subset of unique(A):
B = [1, 3, 4];
For each element in B, I would like to find all of the corresponding indexes in A. So far I am using a simple FOR loop to achieve this:
indexes = [];
for i = 1:length(B)
indexes = [indexes, find(A == B(i))];
end
I would like to write an alternative which does not require a FOR loop. My problem is that for each element in B, I want all of the corresponding indexes in A. Functions like ISMEMBER and INTERSECT do not include repetitions.
I don't need to distinguish between the elements in B, so the output can be a single 1xN vector containing all of the indexes in A. For the above example, the output would be:
indexes = [1, 8, 3, 7, 11, 13, 16, 4, 5, 9, 14];
The final order of INDEXES is arbitrary. It can be sorted or random.
Thanks!
EDIT: I found the solution:
[LIA, ~] = ismember(A, B);
indexes = find(A(LIA));
0 件のコメント
採用された回答
その他の回答 (1 件)
Jakob B. Nielsen
2020 年 3 月 6 日
Logical indexing for every instance, then convert the logical output to doubles and sum it (since you cant sum logicals), and find the indexes where there is a 1, at a glance. It wont give the same order of indexes as in your example but I guess that doesnt matter too much if you dont need to distinguish the elements in B.
logic=(A==B(:));
logic=sum(double(logic));
find(logic==1)
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!