# Get indices of matching values (vectorized find function)

3 vues (au cours des 30 derniers jours)
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)
##### 0 commentairesAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens

Connectez-vous pour commenter.

### Réponse acceptée

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 commentaireAfficher AucuneMasquer Aucune
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 le 25 Sep 2023
[~,b_reconstructed]=ismember(c,a)
##### 0 commentairesAfficher -1 commentaires plus anciensMasquer -1 commentaires plus anciens

Connectez-vous pour commenter.

### Catégories

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

R2021a

### Community Treasure Hunt

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

Start Hunting!