2016-01-15 4 views
0

У меня есть 1x1 Matlab-структуру с 15 полямиПеребор Matlab структуры

results = 

    RAR_no_compartments_2_0: [1x1 struct] 
    RAR_no_compartments_2_1: [1x1 struct] 
    RAR_no_compartments_2_10: [1x1 struct] 
    RAR_no_compartments_2_11: [1x1 struct] 
    RAR_no_compartments_2_12: [1x1 struct] 
    RAR_no_compartments_2_13: [1x1 struct] 
    RAR_no_compartments_2_14: [1x1 struct] 
    RAR_no_compartments_2_2: [1x1 struct] 
    RAR_no_compartments_2_3: [1x1 struct] 
    RAR_no_compartments_2_4: [1x1 struct] 
    RAR_no_compartments_2_5: [1x1 struct] 
    RAR_no_compartments_2_6: [1x1 struct] 
    RAR_no_compartments_2_7: [1x1 struct] 
    RAR_no_compartments_2_8: [1x1 struct] 
    RAR_no_compartments_2_9: [1x1 struct] 

Я пытаюсь цикл через каждый из них в for цикла:

model_names=fieldnames(results); %get the names of each sub-struct 
fieldname_dims=size(fieldnames(results)); %get dimensions of each struct 
for i=1:fieldname_dims(1), %iterate over number of substructs 
    name=model_names(i) %get the model name 
    results.(name) %access the substruct 
end 

Однако Matlab возвращает следующее ошибка:

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

Не могли бы вы объяснить, почему это недопустимое поле?

+2

Возврат 'fieldnames' - это массив ячеек. Вам нужно индексировать его с помощью '{}', а не '()' – excaza

ответ

3

Это именно то, что сделано для structfun. Это позволяет вам перебирать все поля структуры.

a = struct('a', 1, 'b', 2, 'c', 3); 
structfun(@(x)disp(x), a) 

1 
2 
3 

В качестве альтернативы, вы можете рассмотреть хранение в массив структур, а не структуру, где поля имеют номера в них, как у вас есть. В любое время, когда вы зависите от имени поля, чтобы знать порядок, может быть лучше использовать другую структуру данных.

Ибо в ваших данных, а не имея имя_поль из RAR_no_compartments_2_0 вы бы просто назначить-структуру, назначенную для этого поля по индексу

RAR_no_compartments(1) = results.RAR_no_compartments_2_0; 
RAR_no_compartments(2) = results.RAR_no_compartments_2_1; 
... 

Этого пути, а не 1 х 1 с 15 структуры полей, у вас будет массив из 1 x 15 структур, который намного проще обрабатывать внутри MATLAB.

Просто мысль.

2

Проблема заключается в том, что fieldnames возвращает массив ячеек, поэтому вам нужно использовать фигурные скобки для доступа к содержимому ячейки. Это должно работать:

model_names=fieldnames(results); 
fieldname_dims=size(fieldnames(results),1); 
for i=1:fieldname_dims 
    name=model_names{i}; 
    results.(name) 
end 

Все это может быть упрощено фактически итерация массива клеток вместо того, чтобы использовать счетчик и временные переменные:

for name = fieldnames(results).' 
    results.(name{:}) % do whatever with your field 
end 

Однако, правильный путь, чтобы получить доступ все поля a struct is structfun -see Suever's answer.