【问题标题】:MATLAB: save a class propertyMATLAB:保存类属性
【发布时间】:2015-04-14 23:40:56
【问题描述】:

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

但这些都没有预期的效果。谁能帮帮我?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    你可以重载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
    

    【讨论】:

    • 谢谢!这正是我想要的。我只是错过了myProp = a.myProp;
    【解决方案2】:

    第一种方法(涉及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 保存您的类的实例时,当您调用 save(如果存在)时,它将使用 saveobj 方法。这个方法的输出可以是一个对象、一个结构、一个数组等等。你想测试这是否已经发生,你会做一些自然的事情:

    >> 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

    【讨论】:

    • 我正在寻找一种方法来仅保存该属性。我无意恢复课堂。还是谢谢。
    • 我意识到这一点。检查加载构造函数发生了什么的目的是解释为什么 save 方法会以它的方式工作。如果您实际上对使用保存/加载不感兴趣,那么您可以编写任何名称的方法来保存 .mat 文件。
    • 是的,那也很好。干杯
    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2014-03-30
    • 2013-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多