文章目录
6 MATLAB对象的保存和载入
6.1 save和load命令
对象的save和load操作
save filename obj
将对象obj中的数据保存到filename中的mat文件中,(对象转化为一个MATLAB的struct)
load filename obj
将mat文件中的对象obj装载到工作空间中。
mat文件的格式是公开的。
mat文件保存的对象内容。
- obj所属类的名称和Package名称
- obj所属类的属性默认值。如果MATLAB文件中有多个同类对象,默认值则只需拷贝一份。
- obj中普通属性的值。
save过程和属性的默认值
在save后,即使修改了类的定义的默认值,在load之前的保存的对象的mat,仍为最初的默认值,不随后面的类的修改而改变。
mat文件中没有保存的内容
- 对象的transient、Constant、Dependent属性。
- 类的完整定义
保存handle类的对象要检查handle的有效性。
即在保存之前要确保保存的对象的类并未调用析构函数,造成一个无效的类对象,不包含任何数据。
此外在save和load类对象时,必须确保类的定义在搜索路径上。
类的定义在save后发生了变化
属性名变化
则其属性load时会装载失败,其余不变。
添加了新的属性
load时正常导入,同时添加相应的新属性并将其赋给默认值。
属性被删除
load时不在导入被删除属性。
6.2 saveobj和loadobj方法
定义saveobj 方法
classdef Myclass
properties
x
end
methods
function s = saveobj(obj)
s.x = obj.x; % s is a struct
end
end
end
储存的struct的field 名字最好和类的属性名保持一致。
如何定义一个loadobj方法
提供配套的loadobj方法:
methods(Static)
function obj = loadobj(obj)
if isstruct(obj)
newobj = Myclass(obj.x);%利用结构体信息重新构建一个对象。
end
obj = newobj;
end
end
loadobj方法必须是静态方法(Static),
load filename obj
时,成员方法会自动调用。
6.3 继承情况下的saveobj和loadobj方法
类存在继承时,设计saveobj
当类存在继承结构时,需要对父类和子类均设计一个saveobj方法,首先调用父类的方法,再调用子类的方法。
classdef Mysuper
properties
X
Y
end
methods
function S = saveobj(obj)
S.PointX = obj.X;
S.PointY = obj.Y;
end
end
end
classdef MySub < MySuper
properties
Z
end
methods
function S = saveobj(obj)
S = saveobj@MySuper(obj);
S.PointZ = obj.Z;
end
end
end
当存在继承时,如何设计loadobj方法
父类设计
function obj = reload(obj,S)
obj.X = S.PointX;
obj.Y = S.PointY;
end
end
methods(Static)
function obj = loadobj(S)
obj = MySuper;
obj = reload(obj,S);
end
end
子类设计
function obj = reload(obj,S)
obj = reload@MySuper(obj);
obj.Z = S.PointZ;
end
end
methods(Static)
function obj = loadobj(S)
obj = Mysub;
obj = reload(obj,S);
end
end
此时父类和子类均可分别实现数据的load。
6.4 瞬态属性
saveobj方法可以定制对应的保存结果。但当一个类中属性较多时,遍历这些属性进行保存将变得不方便。此时只需在属性中设置不需导出的属性为瞬态属性(Transient)。
classdef Calculation < handle
properties
results
end
properties(Transient)
intermediateVal
end
methods
function obj = Calculation()
disp();
obj.intermediateVal = 'disposeable';
end
end
end
此时执行save并未保存对应的intermediateVal。
6.5 什么是装载时构造(ConstructOnLoad)
一般情况下,装载时,并不会调用构造函数。
使用装载时构造函数,会在加载mat时,调用默认的构造函数。
classdef(ConstructOnLoad) Calculation < handle
properties
results
end
properties(Transient)
intermediateVal
end
methods
function obj = Calculation()
disp();
obj.intermediateVal = 'disposeable';
end
end
end