2011-09-21 37 views
1

是否可以像使用向量一样在数值上遍历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); 
+0

看到这个问题[如何访问循环内的MATLAB结构域?](http://stackoverflow.com/questions/1882035/how-do-i-access-matlab-structure-fields-within-a-循环) – Aabaz

回答

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

+0

这主要是我所拥有的,但问题是Simulink中的Matlab嵌入式功能块不支持此方法。首先,字段名称需要coder.instrinsic,然后不支持单元操作。我也尝试做一些稍微不同的事情,我只是像你一样增加字段名称,s.field1,s.field2,并在代码中尝试增加:s。(['field'i]),但也失败了。坏消息! – tmar89

+0

@ tmar89:哦,我明白了。我对SimuLink和编码器没有太多的经验知道什么是或不支持,但是我想如果我的解决方案不起作用,它可能是代码生成中缺少的基础。 – Egon

2

你应该能够动态地使用sprintf的使用类似下面生成的字段名:

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