1

SIMULINK の EML (Embedded Matlab) 関数ブロック内の 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 ブロック (EML) のバス型パラメーターです。以下は、私が問題を抱えている領域です。構造体内の要素の数と名前を知っていますが、要素の数は構成によって変わる可能性があります。したがって、要素名に基づいてハードコードすることはできません。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 のような外部関数は使用できません。

4

1 に答える 1

2

構造体に動的フィールド名を使用しようとしていると思います。正しい構文は次のとおりです。

element = p_Elements.( sprintf('Element%d',i) );
type = element.type;
%# ...
于 2011-10-29T12:23:30.827 に答える