How to add multiple variables to a structure
75 次查看(过去 30 天)
显示 更早的评论
I have a cell ('varNames') containing variable names that I want to add to a structure ('s'). I am currently acheiving this using the evaluate command as:
for i=1:length('varNames')
eval(strcat('s.',varNames{i},'=',varNames{i},';'));
end
However, I want to avoid using the evaluate command, as I will be using this code inside a parfor loop to speed up Simulink simulations. I have so far tried the solution here with a method to extract variable names described here as:
getname = @(x) inputname(1);
makeStruct = @(x) struct(getname(x),x);
s = cellfun(makeStruct, varNames);
But it just adds the variable names to the structure 's', not the actual variables. The variables are structures themseleves generated by the ToWorkspace blocks of Simulink.
1 个评论
回答(1 个)
Jiri Hajek
2023-1-13
Hi, eval is indeed completely unnecessary for your assignment.To create a new field in a structure, for which you have a name defined by a character vector or a string, use parentheses.
s.(newFieldName) = newData;
The newData may of course by a struct. The newFieldName must be string or character vector, which you may supply in a variable, e.g. varNames{i} as in your example.
7 个评论
Steven Lord
2023-1-14
You're going to need to use eval or save and load to do it this way.
But let's take a step back. You say you have a lot of variables; how did you get those into your workspace in the first place? There may be ways to modify that code to avoid creating those variables.
One example is if you're calling load without an output modify that call to call it with an output. Let's set up some sample data.
cd(tempdir)
x = 1;
y = 'two';
z = magic(3);
save mymatfile.mat x y z
Now let's clear the workspace and confirm that it's clear.
clear all
whos
You could load without an output:
load mymatfile.mat
whos
Or you could call load with an output. Note that x, y, and z are not loaded as individual variables. They're loaded as fields of the struct named data.
clear all
data = load('mymatfile.mat')
whos
Stephen23
2023-1-14
"...as there are many variables, and don't want to assign each variable to the structure without a loop."
That is a sign that your data design probably need to be improved. Instead of creating lots of separate variables, you should probably create one array in the first place. For example, if you are LOADing data from a MAT file, then simply LOAD into an output variable (which is a scalar structure):
S = load(..);
See more tips and advice here: https://www.mathworks.com/matlabcentral/answers/304528-tutorial-why-variables-should-not-be-named-dynamically-eval
If you only have a handful of variables, then you could use a function like this (untested):
function S = mystruct(varargin)
S = struct();
for k = 1:nargin
S.(inputname(k)) = varargin{k};
end
end
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Whos 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!