2011-09-21 113 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