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 не происходит.