假设我有一串与一组人的身高相对应的值
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'}
和单个身高值。
height_val = 177;
我想找到height_val
+ - 3cm范围内的人的指数。
要找到我想要的完全匹配
[idx_height,~]=find(ismember(cell2mat(height_str),height_val/100));
如何在之前的范围(174-180)中包含匹配项?
idx_height
应为= [1 5 6 7]
答案 0 :(得分:3)
您可以通过
将字符串转换为数字数组(如@Divakar所述)height = str2num(char(height_str))*100; % in cm
然后只是
idx_height = find(height>=height_val-3 & height<=height_val+3);
答案 1 :(得分:1)
假设高度的精确度保持在0.01cm
,您可以将str2double
和ismember
的组合用于单行 -
idx_height = find(ismember(str2double(height_str)*100,[height_val-3:height_val+3]))
str2double
的神奇之处在于,它可以直接与单元格数组一起使用,从而无需将单元格数组转换为char数组再转换为数字数组。
使用str2double
后,我们可以在您的问题中尝试使用ismember
来将匹配作为逻辑数组来获取,其索引将使用{{1}获取}。这真的是整个故事。
答案 2 :(得分:1)
延迟添加,但对于binning我的第一选择是使用bsxfun
和逻辑操作:
idx_height = find(bsxfun(@le,str2double(height_str)*100,height_val+3) & ...
bsxfun(@ge,str2double(height_str)*100,height_val-3))