是否可以像向量一样以数字方式迭代MATLAB结构而不是使用字段名称?
简单地说,我正在尝试在Simulink的EML块中执行以下操作:
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);
答案 0 :(得分:2)
您应该能够使用sprintf动态生成字段名,如下所示:
for i = 1:length(s)
theFieldName = sprintf('somevar%d', S(i).type);
val = S(i).val * getfield(S(i), theFieldName);
end
答案 1 :(得分:1)
您需要使用字段名称,但您可以动态执行此操作。如果您将结构定义为:
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
如果这些是确切的字段名称,您应该做其他一些事情。首先,您需要重新考虑您的名字,其次您可以使用Matt的部分解决方案来简化您的代码。