2011-10-28 13 views
1

私は、SIMULINKのEML(Embedded Matlab)関数ブロック内のMATLABワークスペースに形成された構造を反復しようとしています。以下はいくつかのコード例です:Simulinkの組み込みMatlab関数で構造体を反復処理するにはどうすればよいですか?

% Matlab code to create workspace structure variables 
% Create the Elements 
MyElements = struct; 
MyElements.Element1 = struct; 
MyElements.Element1.var1 = 1; 
MyElements.Element1.type = 1; 
MyElements.Element2 = struct; 
MyElements.Element2.var2 = 2; 
MyElements.Element2.type = 2; 
MyElements.Element3 = struct; 
MyElements.Element3.var3 = 3; 
MyElements.Element3.type = 3; 

% Get the number of root Elements 
numElements = length(fieldnames(MyElements)); 

MyElementsは、SIMULINKのMATLAB Function Block(EML)のBus型パラメータです。以下は私が問題を抱えている地域です。私は私の構造体内の要素の数を知っていて、名前は知っていますが、要素の数はどのような構成でも変更できます。だから私は要素名に基づいてハードコードすることはできません。私はEMLブロック内の構造体を反復処理する必要があります。

function output = fcn(MyElements, numElements) 
%#codegen 
persistent p_Elements; 

% Assign the variable and make persistent on first run 
if isempty(p_Elements) 
    p_Elements = MyElements;  
end 

% Prepare the output to hold the vars found for the number of Elements that exist 
output= zeros(numElements,1); 

% Go through each Element and get its data 
for i=1:numElements 
    element = p_Elements.['Element' num2str(i)]; % This doesn't work in SIMULINK 
    if (element.type == 1) 
     output(i) = element.var1; 
    else if (element.type == 2) 
     output(i) = element.var2; 
    else if (element.type == 3) 
     output(i) = element.var3; 
    else 
     output(i) = -1; 
    end 
end 

SIMULINKで構造体タイプをどのように反復処理することができますか?また、ターゲットシステムでコンパイルされるため、num2strのような外部関数は使用できません。

答えて

2

私はあなたが構造のためにdynamic field namesを使用しようとしていると信じています。正しい構文は次のとおりです。

element = p_Elements.(sprintf('Element%d',i)); 
type = element.type; 
%# ... 
関連する問題