Search code examples
matlabfindcell-arraybinning

find value in a string of cell considering some margin


Suppose that I have a string of values corresponding to the height of a group of people

height_str ={'1.76000000000000';
'1.55000000000000';
'1.61000000000000';
'1.71000000000000';
'1.74000000000000';
'1.79000000000000';
'1.74000000000000';
'1.86000000000000';
'1.72000000000000';
'1.82000000000000';
'1.72000000000000';
'1.63000000000000'}

and a single height value.

height_val = 177;

I would like to find the indices of the people that are in the range height_val +- 3cm.

To find the exact match I would do like this

[idx_height,~]=find(ismember(cell2mat(height_str),height_val/100));

How can I include the matches in the previous range (174-180)?

idx_height should be = [1 5 6 7]


Solution

  • Assuming that the precision of heights stays at 0.01cm, you can use a combination of str2double and ismember for a one-liner -

    idx_height = find(ismember(str2double(height_str)*100,[height_val-3:height_val+3]))
    
    • The magic with str2double is that it works directly with cell arrays to get us a numeric array without resorting to a combined effort of converting that cell array to a char array and then to a numeric array.

    • After the use of str2double, we can use ismember as you tried in your problem to get us the matches as a logical array, whose indices are picked up with find. That's the whole story really.