MATLAB:保存一个类属性

时间:2015-04-14 23:40:56

标签: matlab

我想将特定的类属性保存到磁盘,而忽略其余的类属性。我认为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

但这些都没有达到预期的效果。有人可以帮帮我吗?

2 个答案:

答案 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)

您可以重载save功能,而无需通过saveobj

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