Итерация по структуре MATLAB численно
Возможно ли выполнять итерацию по структуре MATLAB численно, как вектор, вместо использования имен полей?
Просто я пытаюсь сделать следующее внутри блока EML для Simulink:
S.a.type = 1;
S.a.val = 100;
S.a.somevar = 123;
S.b.type = 2;
S.b.val = 200;
S.b.somevar2 = 234;
S.c.type = 3;
S.c.val = 300;
S.c.somevar3 = 345;
for i = 1:length(s)
itemType = S(i).type;
switch itemType
case 1
val = S(i).val * S(i).somevar1;
case 2
val = S(i).val * S(i).somevar2;
case 3
val = S(i).val * S(i).somevar3;
otherwise
val = 0
end
end
disp(var);
2 ответа
Вам нужно использовать имена полей, но вы можете делать это динамически. Если у вас есть структура, определенная как:
s.field1 = 'foo';
s.field2 = 'bar';
Тогда вы можете получить доступ к полю field1
либо с
s.field1
s.('field1')
Единственное, что вам нужно, это функция fieldnames
динамически получать имена полей, так что ваш пример кода будет выглядеть примерно так
elements = fieldnames(S);
for iElement = 1:numel(elements)
element = S.(elements{iElement});
itemType = element.type;
switch itemType
case 1
val = element.val * element.somevar1;
case 2
val = element.val * element.somevar2;
case 3
val = element.val * element.somevar3;
end
end
Если это точные имена полей, вам следует заняться другими вещами. Во-первых, вам нужно переосмыслить свои имена, а во-вторых, вы можете использовать часть решения Мэтта для упрощения вашего кода.
Вы должны быть в состоянии генерировать имена полей динамически, используя sprintf, используя что-то вроде следующего:
for i = 1:length(s)
theFieldName = sprintf('somevar%d', S(i).type);
val = S(i).val * getfield(S(i), theFieldName);
end