Iterating through struct fieldnames in MATLAB

noio picture noio · May 10, 2010 · Viewed 100.1k times · Source

My question is easily summarized as: "Why does the following not work?"

teststruct = struct('a',3,'b',5,'c',9)

fields = fieldnames(teststruct)

for i=1:numel(fields)
  fields(i)
  teststruct.(fields(i))
end

output:

ans = 'a'

??? Argument to dynamic structure reference must evaluate to a valid field name.

Especially since teststruct.('a') does work. And fields(i) prints out ans = 'a'.

I can't get my head around it.

Answer

gnovice picture gnovice · May 10, 2010

You have to use curly braces ({}) to access fields, since the fieldnames function returns a cell array of strings:

for i = 1:numel(fields)
  teststruct.(fields{i})
end

Using parentheses to access data in your cell array will just return another cell array, which is displayed differently from a character array:

>> fields(1)  % Get the first cell of the cell array

ans = 

    'a'       % This is how the 1-element cell array is displayed

>> fields{1}  % Get the contents of the first cell of the cell array

ans =

a             % This is how the single character is displayed