对MATLAB结构进行数值迭代

对MATLAB结构进行数值迭代,matlab,structure,loops,simulink,eml,Matlab,Structure,Loops,Simulink,Eml,是否可以像向量一样在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 =

是否可以像向量一样在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);

您应该能够使用sprintf动态生成字段名,使用类似于以下的方法:

for i = 1:length(s)
    theFieldName = sprintf('somevar%d', S(i).type);
    val = S(i).val * getfield(S(i), theFieldName);
end

您需要使用字段名,但可以动态地这样做。如果您的结构定义为:

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的部分解决方案来简化代码

看这个问题,这是我的主要问题,但问题是Simulink中的Matlab嵌入式功能块不支持这种方法。首先,字段名需要coder.instrinsic,然后不支持单元格操作。我也试着做一些稍微不同的事情,我只是像你一样增加字段名,s.field1,s.field2,在代码中试着增加像:s.(['field'I]),但也失败了。真倒霉@tmar89:哦,我明白了。我在SimuLink和编码器方面没有太多的经验,不知道什么是或不支持的,但我想如果我的解决方案不起作用,可能是代码生成中缺少的一些基本内容。