Trying to replace for loop with faster code
1 view (last 30 days)
I have the following code in a rather large script, which unfortunately is VERY slow:
for x = 1:size(table1)
for y = 1:size(Loc_all)
if ismember(table1.Loc(x),Loc_all(y)) == 1
table1.dur(x) = t_avg(y);
It definitely works, but again the duration time is not "workable".
So I tried the following:
f = ismember(table1.Loc,Loc_all) == 1;
table1.dur(IndexM) = t_avg(IndexN);
It works for IndexM which defines the location in table1.Loc - but it wont work for IndexN - all I get here is 1's. What am I missing?
As you can see t_avg and Loc_all have the same size, as do table1.Loc and table1.dur - I'm expecting IndexN to give the Location in Loc_all where a match happens.
Loc_all only has unique values. table1.Loc is a large table of values which may or may not be in Loc_all.
Any hints are very much appreciated!
Voss on 23 Aug 2021
The second output argument of the find function is column indices. In order to get indices in Loc_all where a match happens, you can use the second output argument of ismember:
[f, IndexN] = ismember(table1.Loc,Loc_all); % f is the same as your f; IndexN is what you expect, except it has zeros where no match occurred (i.e., where f is false)
IndexN = IndexN(f); % keep only the IndexN where a match occurred
IndexM = find(f); % convert logical index f to integer index IndexM; IndexM is the same as your IndexM