以数字方式迭代MATLAB结构
问题描述:
是否可以像使用向量一样在数值上遍历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);
答
您需要使用字段名称,但您可以动态地进行。如果你有一个结构定义为:
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解决方案的一部分来简化你的代码。
答
你应该能够动态地使用sprintf的使用类似下面生成的字段名:
for i = 1:length(s)
theFieldName = sprintf('somevar%d', S(i).type);
val = S(i).val * getfield(S(i), theFieldName);
end
看到这个问题[如何访问循环内的MATLAB结构域?](http://stackoverflow.com/questions/1882035/how-do-i-access-matlab-structure-fields-within-a-循环) – Aabaz