Obtaining all the indices of matached elements of one array in another
28 ビュー (過去 30 日間)
古いコメントを表示
Given two vectors A and B, I'd like to find all the indices of matched elements of B in A. So if I have:
A=[1 2 1 2 2 3 1];
B=[1 2 3];
output=[1 3 7;2 4 5;6 0 0].
The first row corresponds to find(A==B(1)), and the second row corresponds to find(A==B(2)), etc;
I know this can be done easily with for loop, but looping over the vector B will be really slow as I have a really big vector of A and vector of B with 43200 elements. Moreover, I am doing a long process after this step, so I am looking for solution through vectorization. I tried different approaches, but non gave me all indices! I am not sure if there's solution through vectorization, but I thought I'd ask here.
Any ideas?
0 件のコメント
回答 (3 件)
Eric
2017 年 11 月 1 日
編集済み: Eric
2017 年 11 月 1 日
You will run into problems if there are different amounts of A which equal B. If you care to know both indicies, use something like this:
[ia,ib] = find(bsxfun(@eq,shiftdim(A,1),B));
It will return all possible matches of all values of B to A, where the ib are the indicies of B and ia are the indicies in A. If you know for sure that there will always be 3 matches in all of A to every B, you can add something like
output = reshape(ia,[3 numel(ia)/3])';
to get your above output (confirmed with your provided test case of A and B).
Jos (10584)
2017 年 11 月 1 日
As Eric said, you will run into trouble in most cases. I suggest you store the output in a cell array, like this:
A = [1 2 1 1 2 3]
B = [1 2 3 4]
output = arrayfun(@(x) find(A==x), B, 'un', 0)
% output{k} holds all the indices into A, where A equals B(k)
2 件のコメント
Jos (10584)
2017 年 11 月 2 日
well written for-loops with pre-allocation are nowadays very fast. As you asked for a vectorised solution, I just provided one :)
Carl Witthoft
2019 年 9 月 27 日
If your version of MATLAB isn't too old, look up help on intersect, to wit;
[dat, idxa, idxb] = intersect(a,b,'stable')
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Matrix Indexing についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!