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)

 Accepted Answer

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 Comment

However, tolerances shouldn't be necessary if it is known, as in the example, that c is an exact subset of a.

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Release

R2021a

Asked:

on 25 Sep 2023

Edited:

on 25 Sep 2023

Community Treasure Hunt

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

Start Hunting!