Effacer les filtres
Effacer les filtres

How can I save the matlab workspace in a structure?

99 vues (au cours des 30 derniers jours)
Gaurav Pandey
Gaurav Pandey le 1 Fév 2015
Modifié(e) : Matt J le 27 Fév 2019
I have a program that modifies a lot of variables in the workspace in every iteration. At the end of every iteration I need to check the old as well as the updated values of some of the variables in the workspace. Is there a way for me to do this by saving the current workspace in a structure and then comparing the current workspace with the structure?

Réponse acceptée

Matt J
Matt J le 1 Fév 2015
Modifié(e) : Matt J le 1 Fév 2015
If a struct is really what you want, you can automatically generate statements to build the struct, using STRUCTVARS ( Download ).
>> a=1, b=2, c=3
a =
1
b =
2
c =
3
>> z=[who,who].'; myStruct=struct(z{:}); structvars(myStruct,0)
ans =
myStruct.a = a;
myStruct.b = b;
myStruct.c = c;
The idea is just to copy/paste the assignment commands into your mfile and update them as needed.
  9 commentaires
Matt J
Matt J le 27 Fév 2015
I don't use Simulink, but I have a hard time seeing why, if you are able to execute,
myStruct.(names{j}) = eval(names{j});
you cannot just as easily, and at the same place in your code, execute
myStruct.a=a;
The two are absolutely equivalent when names{j}='a'. Obviously, you can do the same with all of your other variables.
Stephen23
Stephen23 le 27 Fév 2015
Modifié(e) : Stephen23 le 27 Fév 2015
@Dani Tormo: you really should avoid using eval for such a trivial thing as allocating values to a variable. Structures are perfectly capable of storing your values in a loop, and Matt J has shown you exactly how to do this. If you want robust code, learn to avoid eval:

Connectez-vous pour commenter.

Plus de réponses (3)

Alexander Venus
Alexander Venus le 27 Fév 2019
w = whos;
for a = 1:length(w)
str.(w(a).name) = eval(w(a).name);
end
  1 commentaire
Matt J
Matt J le 27 Fév 2019
Modifié(e) : Matt J le 27 Fév 2019
This solution was already discussed (and discouraged) here. Although, in hindsight, this is probably one of the safer applications of eval - no risk here of being shadowed by existing function names.

Connectez-vous pour commenter.


Matt J
Matt J le 1 Fév 2015
Modifié(e) : Matt J le 1 Fév 2015
Well, the cheesy and simple way to do it is,
S=load(save(dummyFilename));
However, I am somewhat skeptical that you're going down the right path with this. If all your variables are scalars, you should really be storing them concatenated in a vector and using vectorized functions to do all the comparisons.
  2 commentaires
Gaurav Pandey
Gaurav Pandey le 1 Fév 2015
No, all the variables are matrices.
Image Analyst
Image Analyst le 1 Fév 2015
You accepted an answer, so are you still having trouble or not? I'm guessing not.
By the way, I do this all the time. I put the status of all my GUI widgets into a structure called UserSettings, and then save that when the app exits. Then when the user runs the app again, I retrieve that and set up the GUI just the way it was the last time they ran it - all the same settings.

Connectez-vous pour commenter.


Image Analyst
Image Analyst le 1 Fév 2015
Modifié(e) : Image Analyst le 1 Fév 2015
You can save the variables in a structure
s.var1 = var1;
s.var2 = var2;
% Save to disk if you want
save(fullFileName, 's');
You can retrieve from disk, if you need to
s = load(fullFileName);
var1prior = s.var1;
var2prior = s.var2;
You can then compare variable by variable. I don't believe there is a way to compare a whole structure at once because each field can be vastly different data types.
if var1prior ~= var1
warndlg('var1 changed!');
end
if var2prior ~= var2
warndlg('var2 changed!');
end

Catégories

En savoir plus sur Startup and Shutdown dans Help Center et File Exchange

Produits

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by