MATLAB Answers

How to append a field to an existing structure in a mat file?

63 views (last 30 days)
madhan ravi
madhan ravi on 15 Aug 2019
Commented: madhan ravi on 15 Aug 2019
s.a = rand;
s.b = rand(2);
load s
s.c = 'yes'
save('s.mat','s') % now the new field is added
Is there any other alternatives?, the '-append' flag is there not sure how to yield success though.


dpb on 15 Aug 2019
save(filename,variables,'-append') adds new variables to an existing file.
If a variable already exists in a MAT-file, then save overwrites it with the
value in the workspace.
A struct as the whole is the variable, not a field within the structure.
If the alternative includes that the new data be actually part of an existing struct variable, then I think the answer is "no".
If you would be content with just saving an additional variable but outside the already defined struct, then -append does the job.
If the variable were just an array, matfile would allow indexing including, I believe, extending the size but can't write the dot indexing expression to address a field of a struct

Sign in to comment.

Answers (1)

Walter Roberson
Walter Roberson on 15 Aug 2019
clear s
s.a = rand;
s.b = rand(2);
save('s.mat','-struct', 's', '-v7.3');
s = matfile('s.mat', 'writable', true);
s.c = 'yes';
clear s
whos -file s.mat


Show 1 older comment
Bruno Luong
Bruno Luong on 15 Aug 2019
dpb is correct, I think Walter solution does not exactly question asked. This will save 'a' 'b' as variables and not inside the structure internally stored inside the matfile..
save('s.mat','-struct', 's', '-v7.3')
It just trick the load by MATFILE later inside a structure but there is no internal field add inside thet MATFILE.
It does not do more than
s.a = rand;
s.b = rand(2);
save('s.mat','-struct', 's')
save('s.mat','-append', 'c')
Walter Roberson
Walter Roberson on 15 Aug 2019
It does a bit more in that there is no need to explicitly save(): as soon as you create the reference, the new variable is written into the .mat file.

Sign in to comment.

Sign in to answer this question.