# Fastest way to cycle through a structure for a number

7 views (last 30 days)
Will Kinsman on 1 Aug 2016
Commented: Stephen23 on 2 Aug 2016
given: a structure and a double
return: the index of a structure that has that number
data:
structure(1).val = 50
structure(2).val = 47
structure(3).val = 22
given: structure, 50
return: 1
given: structure, 22
return: 3
% my attempt
function y = return_struct_index(structure,inputval)
for i = 1:length(structure)
if structure(i).val==inputval
y = i;
return
end
end
y = [];
This is rather slow and comes in at about 2.5 seconds for 1000 iterations for my code. I know for a fact there is a faster way to do this but haven't been able to track it down. Obviously I haven't vectored my function. I have also tried converting the structure to a cell array and then vectoring the solution, but the conversion makes it even slower.
Help greatly appreciated!!
Will
Stephen23 on 2 Aug 2016
If there are non-scalar arrays in the field val:
S(1).val = 50;
S(2).val = 47;
S(3).val = [23,5];
fun = @(n)find(arrayfun(@(s)any(s.val(:)==n),S));
>> fun(22)
ans =
Empty matrix: 1-by-0
>> fun(23)
ans =
3

James Tursa on 1 Aug 2016
Edited: James Tursa on 1 Aug 2016
result = find([structure.val]==value);
E.g.,
>> structure(1).val = 50;
>> structure(2).val = 47;
>> structure(3).val = 22;
>> find([structure.val]==50)
ans =
1
>> find([structure.val]==47)
ans =
2
>> find([structure.val]==22)
ans =
3
>> find([structure.val]==99)
ans =
Empty matrix: 1-by-0
Will Kinsman on 1 Aug 2016
Edited: Will Kinsman on 1 Aug 2016
thanks so much. massively improved my programs performance by about 10 minutes. run time per 1000 iterations came in at about .5 seconds

Azzi Abdelmalek on 1 Aug 2016
s(1).val = 50
s(2).val = 47
s(3).val = 22
find([s(:).val]==50)