Vectorized alterlative to identify duplicate elements in an array

3 ビュー (過去 30 日間)
fsgeek
fsgeek 2020 年 3 月 6 日
コメント済み: fsgeek 2020 年 3 月 6 日
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));

採用された回答

fsgeek
fsgeek 2020 年 3 月 6 日
編集済み: fsgeek 2020 年 3 月 6 日
[LIA, ~] = ismember(A, B);
indexes = find(LIA);
  2 件のコメント
Stephen23
Stephen23 2020 年 3 月 6 日
編集済み: Stephen23 2020 年 3 月 6 日
Simpler on one line:
>> indices = find(ismember(A,B))
indices =
1 3 4 5 7 8 9 11 13 14 16
fsgeek
fsgeek 2020 年 3 月 6 日
Looks good, thanks for the tip!

サインインしてコメントする。

その他の回答 (1 件)

Jakob B. Nielsen
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)

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ

製品


リリース

R2014a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by