2015-04-14 4 views
2

Я хотел бы сохранить определенное свойство класса на диск, игнорируя остальные свойства класса. Я думаю, что MATLAB позволяет переопределить метод saveobj для этой цели. Тем не менее, это сохраняет объект класса только при включенном свойстве. Я хочу сохранить саму собственность без какой-либо информации о классе.MATLAB: сохранить свойство класса

Я мог бы думать, что подходящий метод будет выглядеть следующим образом:

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

Вы можете перегрузить саму 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 
+1

Спасибо! Это именно то, чего я хотел. Я просто пропустил строку 'myProp = a.myProp;' –

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, как вы ожидаете.

+0

Я искал способ сохранить только свойство. Я не собираюсь восстанавливать класс. Спасибо, в любом случае. –

+0

Я понимаю это. Пункт проверки того, что происходит с конструктором нагрузки, заключается в том, чтобы объяснить, почему метод save работает так, как он делает. Если вы фактически не заинтересованы в использовании save/load, вы можете писать методы с любым именем, которое сохраняет файл .mat. –

+0

Да, это было бы хорошо. ура –

Смежные вопросы