Итерация через имена полей структуры в MATLAB

Мой вопрос легко получен в итоге как: "Почему следующее не работает?"

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'.

Я не могу получить голову вокруг этого.

69
задан gnovice 29 March 2017 в 19:53
поделиться

3 ответа

Вы должны использовать фигурные скобки ({}) для доступа к полям, поскольку функция 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
91
ответ дан 24 November 2019 в 13:52
поделиться

Поскольку поля или 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
15
ответ дан 24 November 2019 в 13:52
поделиться

Ваш fns - это массив cellstr. Вам нужно индексировать его с помощью {} вместо (), чтобы получить единственную строку в виде char.

fns{i}
teststruct.(fns{i})

Индексирование () возвращает массив cellstr длиной 1, что не соответствует формату массива char, который нужен динамическому полю ".(имя)". Форматирование, особенно при выводе на экран, может сбить с толку. Чтобы увидеть разницу, попробуйте следующее.

name_as_char = 'a'
name_as_cellstr = {'a'}
5
ответ дан 24 November 2019 в 13:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: