我想将特定的类属性保存到磁盘,而忽略其余的类属性。我认为MATLAB允许为此目的覆盖saveobj
方法。但是,这样只保存附加了该属性的类对象。我想保存属性本身,没有任何类信息。
我可能认为合适的方法如下:
classdef myClass
properties
myProp
end
methods
def b = saveobj(a)
b = a.myProp;
end
def Save(a,fname)
save(fname,'a.myProp');
end
end
end
但这些都没有达到预期的效果。有人可以帮帮我吗?
答案 0 :(得分:1)
第一种方法(涉及saveobj
的方法)实际上是正确的。出于讨论的目的,让我们考虑这个简单的类:
classdef testclass
properties
x
end
methods
function this = testclass(x)
this.x = x ;
end
function a = saveobj(this)
a = this.x ;
end
end
end
当您要求MATLAB保存课程实例时,如果存在saveobj
,则会使用save
方法。此方法的输出可以是对象,结构,数组等等。你想测试这种情况发生了,你做了这样的事情:
>> obj = testclass('hi')
obj =
testclass with properties:
x: 'hi'
>> save tmp.mat obj
>> clear all
>> load tmp.mat
>> obj
obj =
testclass with properties:
x: []
>>
这就是我怀疑你出现混乱的地方。您希望obj为char
,但它是类testclass
的空对象。 (您可以根据保存的类定义验证它只是对象的实例,并且不是通过调用空构造函数来创建的。)
在了解loadobj
的工作原理之前,这似乎相当混乱。为了让MATLAB知道在加载时调用哪个静态方法,它会将类定义与您从自定义saveobj
方法提供的任何输出一起保存。当你调用load
时,它会加载类定义并调用loadobj
静态方法(如果存在)。我们可以通过修改上面的类定义来测试它:
classdef testclass
properties
x
end
methods
function this = testclass(x)
this.x = x ;
end
function a = saveobj(this)
a = this.x ;
end
end
methods( Static )
function this = loadobj(a)
this = testclass(a) ;
end
end
end
如果您使用loadobj
方法设置断点,则可以按预期验证a
的类型确实是char
。
答案 1 :(得分:0)
classdef myClass
properties
myProp
end
methods
function [] = save(a,fname,varargin)
myProp = a.myProp; %#ok<PROP,NASGU>
save(fname,'myProp',varargin{:});
end
end
end
然后在命令窗口:
>> foo = myClass();
>> foo.myProp = 4;
>> foo.save('var.txt');
>> bar = load('var.txt','-mat');
>> bar.myProp
ans =
4