Saving a struct property within a class object

6 views (last 30 days)
I'm trying to save an instance of a class object I've made for later reference. Some of my properties are structs. I can set and manipulate them as expected, but when I save, the saved object reverts to their default values (or empty if there was no default). Do I need to initialize structs in a special way? Or is there an Attribute I need to set?
This is an example of my class:
classdef testclass
properties
S = struct('d', 0, 'e', 1);
number = 1;
end
methods
function obj = set.S(obj, val)
obj.S.d = val + 1;
obj.S.e = val + 3;
end
end
end
My test output - the save function saves the integer value, but doesn't save changes to the struct:
>> t = testclass
t =
testclass with properties:
S: [1×1 struct]
number: 1
>> t.number = 10;
>> t.S = 3;
>> t.S
ans =
struct with fields:
d: 4
e: 6
>> save test.mat t
>> clear
>> load test.mat
>> t.S
ans =
struct with fields:
d: 0
e: 1
>> t.number
ans =
10
The reason my struct set function is written this way is I'd like to give my function a few parameters to calculate trajectory arrays, and then I save those trajectories for reference. This works fine until I try to save my class object, so I've been saving my structs as separate variables outside the class object, i.e.:
S = t.S; save test.mat t S
Is there a cleaner way to do this instead?

Answers (1)

Jeremy
Jeremy on 31 Mar 2020
Edited: Jeremy on 31 Mar 2020
classdef testclass
properties (GetAccess=public, SetAccess=public)
S
number
end
methods
function obj = testclass(num,val)
obj.number = num;
obj.S.d = val + 1;
obj.S.e = val + 3;
end
end
end
>> t = testclass(10,3)
t =
testclass with properties:
S: [1×1 struct]
number: 10
>> t.S
ans =
struct with fields:
d: 4
e: 6
>> save test.mat t
>> clear
>> load test.mat
>> t
t =
testclass with properties:
S: [1×1 struct]
number: 10
>> t.S
ans =
struct with fields:
d: 4
e: 6
Does this help?
  6 Comments
Jeremy
Jeremy on 31 Mar 2020
You call the class methods on the class instance (object) after creation, e.g. in your example you would call it like
t = testclass
update_struct(t)
See some examples here:
Cyndia Cao
Cyndia Cao on 31 Mar 2020
Edited: Cyndia Cao on 2 Apr 2020
edit: realized the problem with this syntax is that testclass is a value class so I'd have to say t = t.update_struct(3) in order for the change to propagate, or I could change testclass to a handle class. Regardless, changing testclass to a handle class doesn't help with the save/load issue of the struct.
--------------------------
To be more explicit, this was my updated class code:
classdef testclass
properties (GetAccess=public, SetAccess=public)
S = struct('d', 0, 'e', 1);
number = 1;
end
methods
function obj = update_struct(obj, val)
disp('in update function')
obj.S.d = val + 1;
disp([obj.S.d, val + 1])
obj.S.e = val + 3;
disp([obj.S.e, val + 3])
end
end
end
And my command line test:
>> t = testclass;
>> t.update_struct(3)
in update function
4 4
6 6
ans =
testclass with properties:
S: [1×1 struct]
number: 1
>> t.S
ans =
struct with fields:
d: 0
e: 1
I've used classes before (though more extensively outside MATLAB). The other functions in the classes I've implemented work as I expect, except for these cases of managing structs.

Sign in to comment.

Categories

Find more on Construct and Work with Object Arrays in Help Center and File Exchange

Tags

Products


Release

R2019b

Community Treasure Hunt

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

Start Hunting!