Search code examples
matlabsimulink

Creating structures in base workspace from function (appease from workspace block for 2D arrays)


I need to create structures inside the base workspace from inside one of my functions and populate them with values, the problem is I don't explicitly know the names of the structures. Why? My model uses from workspace blocks, 2D arrays need structure form, as per Mathworks documentation. See below.

%some function
function [SimulationData,Error,Warnings] = ExtractTestCaseData(TestCaseFile,TestCase,OutputType)
.
.
[NumericData,TextData,RawData] = xlsread(TestCaseFile,TestCase);
.
.
%logic to create and populate simulationData structure with data from excel file
.
.
if regularVector
   assignin('base',SimulationData.Input(InputIndex).Name,SimulationData.Input(InputIndex).Values(1,:)); %no problem
elseif 2DArray
   %now what? I need in the base workspace
   %var.time=[TimeValues]
   %var.signals.values=[DataValues]
   %var.signals.dimensions=[DimValues]
   assignin('base',SimulationData.Input(InputIndex).Name,'1');%create signal name with random value, I don't know the value of Name, need to convert to structure form as in the comments
   evalin('base','nameIDontKnow.time=SimulationData.Time;'); %two problems actually, referencing a name I don't know in base workspace and base workspace has no concept of what SimulatinData.Time is, and so on if you catch my drift.
.
.
end

Does anyone have an idea of how to make this work?


Solution

  • my solution

    for InputIndex
        %2D arrays must be in structure form for from workspace blocks (Mathworks)
        %make structure in base workspace and populate with values
        assignin('base','InputIndex',InputIndex);                  
        assignin('base',SimulationData.Input(InputIndex).Name,'[]');%create the signal/structure name give random value for now                    
        evalin('base', sprintf('%s.time=Time;',SimulationData.Input(InputIndex).Name));
        assignin('base','Values',SimulationData.Input(InputIndex).Values);
        evalin('base', sprintf('%s.signals.values=Values;',SimulationData.Input(InputIndex).Name));
        assignin('base','Dimensions',[size(SimulationData.Input(InputIndex).Values,1) size(SimulationData.Input(InputIndex).Values,2)]);
        evalin('base', sprintf('%s.signals.dimensions=Dimensions;',SimulationData.Input(InputIndex).Name));
    end