Get indices of matching values (vectorized find function)

3 vues (au cours des 30 derniers jours)
Jack Mooney
Jack Mooney le 25 Sep 2023
Modifié(e) : Matt J le 25 Sep 2023
I want to find a function that does a "vectorized find" that would do the below:
>> a = rand(6, 1)
a =
0.4387
0.3816
0.7655
0.7952
0.1869
0.4898
>> b = randi(6, [6, 1])
b =
3
4
5
5
2
5
>> c = a(b)
c =
0.7655
0.7952
0.1869
0.1869
0.3816
0.1869
>> b_reconstructed = somefunction(a, c) % What is somefunction?
I know I can do something like
b_reconstructed = zeros(size(a));
for i = 1:numel(c)
b_reconstructed(i) = find(a == c(i), 1, 'first');
end
But that seems very inefficient if a, b, and c are very large (>10k rows)

Réponse acceptée

Dyuman Joshi
Dyuman Joshi le 25 Sep 2023
Use ismembertol when dealing with floating point numbers, ismember when dealing with integers.
a = rand(6, 1)
a = 6×1
0.9147 0.9363 0.2163 0.6877 0.0031 0.8379
b = randi(6, [6, 1])
b = 6×1
4 1 3 1 5 4
c = a(b)
c = 6×1
0.6877 0.9147 0.2163 0.9147 0.0031 0.6877
B = zeros(size(a));
for i = 1:numel(c)
B(i) = find(a == c(i), 1, 'first');
end
B
B = 6×1
4 1 3 1 5 4
%Indices of elements in 'a' for each element in 'c' that is member of 'a'
[~,idx] = ismembertol(c,a)
idx = 6×1
4 1 3 1 5 4
  1 commentaire
Matt J
Matt J le 25 Sep 2023
Modifié(e) : Matt J le 25 Sep 2023
However, tolerances shouldn't be necessary if it is known, as in the example, that c is an exact subset of a.

Connectez-vous pour commenter.

Plus de réponses (1)

Matt J
Matt J le 25 Sep 2023
[~,b_reconstructed]=ismember(c,a)

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Produits


Version

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by