Get indices of matching values (vectorized find function)

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

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.

Catégories

En savoir plus sur Loops and Conditional Statements dans Centre d'aide 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