Почему класс моего объекта MATLAB (R2008a) изменяется в цикле сохранения / загрузки? - PullRequest
3 голосов
/ 25 марта 2009

UPDATE: Это известная ошибка - ссылка требует входа в Mathworks для доступа к ней.

Сводка сообщения об ошибке

Экземпляр MATLAB, определенный пользователем класс сохранен в файл MAT с помощью Версия 7.6 (R2008a) может не загружаться правильно, если одно из значений его свойств это экземпляр другого MATLAB класс.

Вкратце, Mathworks сообщает, что ранее сохраненный пользовательский объект верхнего уровня может быть загружен неправильно (как описано ниже) и что ошибка возникает на шаге SAVE. Таким образом, данные повреждены внутри файла MAT.

Исходя из моего опыта, это кажется прерывистым. В одном приложении для анализа данных, которое я написал из 75 файлов MAT, 37 были сохранены с этим повреждением: (

Будьте осторожны с пользовательскими объектами. Я добавил следующий тест при сохранении, чтобы убедиться, что данные не повреждены

save('MAT_file_name.mat');

tmp=load('MAT_file_name.mat');
if ~isa(tmp.bb,'superClass')
    msgbox({'THE FILE WAS NOT SAVED PROPERLY', ...
            ' ', ...
            ['    MAT_file_name.mat',]})
end

Оригинальный вопрос

Здесь я использую MATLAB 2008a. Эта тонкая ошибка исправлена ​​в MATLAB-2009a. Во всяком случае, так как два моих класса определены, цикл сохранения / загрузки приводит к тому, что переменные одного класса (суперкласса) загружаются как переменные моего второго класса (пропкласса).

Пример сеанса MATLAB (r2008a)

>> bb=superClass;
>> whos
  Name      Size            Bytes  Class         Attributes
  bb        1x1                60  superClass              

>> save
>> clear
>> clear classes
>> load
>> whos
  Name      Size            Bytes  Class        Attributes
  bb        1x1                60  propClass       

После загрузки matlab.mat переменная bb таинственным образом изменилась с суперкласса на propClass

Класс: суперкласс

Этот класс должен содержать массив типа propClass, и вот его наивное определение

classdef superClass<handle
    properties(SetAccess=private)
        a = propClass.empty  % need to set this property as type propClass 
                             % otherwise the addProp method throws an error
        count=0;
    end
    methods
        function self=superClass
             %empty class definitionS
        end
        function addProp(self)
            p = propClass;
            self.count = self.count+1;
            self.a(self.count)=p;
        end
    end
end

Класс: propClass

PropClass - это второй класс, используемый суперклассом. Его определение не важно для этой ошибки.

Вопрос

Итак, почему суперкласс меняется на propClass после операции загрузки в MATLAB-R2008a? Во-вторых, как я могу изменить определение superClass , чтобы избежать этого симптома?

Примечание

Я столкнулся с этим симптомом в более крупном классе, который я написал, и сузил источник проблемы. Я знаю, что это происходит в сеансе MATLAB, описанном выше, но кажется, что если я добавлю объект в массив свойств в суперклассе, то проблема исчезнет. Поэтому, если я вызываю superClass.addProp перед сохранением, странного изменения с superClass на propClass не происходит.

1 Ответ

2 голосов
/ 25 марта 2009

Это странная проблема! Я не встречал ничего подобного, но одну вещь, которую вы могли бы попробовать в первую очередь, это перенести инициализации свойств в конструктор:

classdef superClass < handle
    properties (SetAccess = private)
        a
        count
    end
    methods
        function self = superClass
            self.a = propClass.empty;
            self.count = 0;
        end
        function addProp(self)
            p = propClass;
            self.count = self.count+1;
            self.a(self.count) = p;
        end
    end
end

Я не уверен, что это будет иметь какое-либо влияние, но это единственное, что я могу придумать, чтобы попробовать. Надеюсь, поможет! =)

...