Мой вопрос легко получен в итоге как: "Почему следующее не работает?"
teststruct = struct('a',3,'b',5,'c',9)
fields = fieldnames(teststruct)
for i=1:numel(fields)
fields(i)
teststruct.(fields(i))
end
вывод:
ans = 'a'
??? Argument to dynamic structure reference must evaluate to a valid field name.
Тем более, что teststruct.('a')
действительно работает. И fields(i)
распечатывает ans = 'a'
.
Я не могу получить голову вокруг этого.
Вы должны использовать фигурные скобки ({}
) для доступа к полям
, поскольку функция fieldnames
возвращает массив ячеек строк:
for i = 1:numel(fields)
teststruct.(fields{i})
end
Использование круглых скобок для доступа к данным в массиве ячеек просто вернет другой массив ячеек, который отображается иначе, чем символьный массив:
>> 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
Поскольку поля
или fns
представляют собой массивы ячеек, вы должны индексировать их с помощью фигурных скобок {}
для доступа к содержимому ячейки, то есть к строке.
Обратите внимание, что вместо того, чтобы перебирать число, вы также можете напрямую перебирать полей
, используя удобные функции Matlab, которые позволяют вам перебирать любой массив. Переменная итерации принимает значение каждого столбца массива.
teststruct = struct('a',3,'b',5,'c',9)
fields = fieldnames(teststruct)
for fn=fields'
fn
%# since fn is a 1-by-1 cell array, you still need to index into it, unfortunately
teststruct.(fn{1})
end
Ваш fns - это массив cellstr. Вам нужно индексировать его с помощью {} вместо (), чтобы получить единственную строку в виде char.
fns{i}
teststruct.(fns{i})
Индексирование () возвращает массив cellstr длиной 1, что не соответствует формату массива char, который нужен динамическому полю ".(имя)". Форматирование, особенно при выводе на экран, может сбить с толку. Чтобы увидеть разницу, попробуйте следующее.
name_as_char = 'a'
name_as_cellstr = {'a'}