Этот пример задает класс, который изменяет поведение индексации значения по умолчанию путем реализации subsref и subsasgn методы. Класс также реализует преобразование типов и сложение путем реализации double метод конвертера и plus метод.
Цель проекта класса к:
Позвольте вам обработать объект класса как числовой массив
Смогите содержать нечисловые и числовые данные в объекте класса
Класс имеет три свойства:
Data — числовые тестовые данные
Description — описание тестовых данных
Date — тест даты проводился
Примите, что у вас есть следующие случайные данные (randi):
d = randi(9,3,4)
d =
8 9 3 9
9 6 5 2
2 1 9 9Создайте экземпляр класса:
obj = MyDataClass(d,'Test001')obj =
MyDataClass with properties:
Data: [3x4 double]
Description: 'Test001'
Date: [2012 1 7 9 32 34.5190]Аргументы конструктора передают значения для Data и Description свойства. clock функционируйте присваивает значение Date свойство из конструктора. Этот подход получает информацию о времени и дате, когда каждый экземпляр создается.
Вот предварительный листинг кода без subsrefsubsasgn
double, и plus методы.
classdef MyDataClass properties Data Description end properties (SetAccess = private) Date end methods function obj = MyDataClass(data,desc) if nargin > 0 obj.Data = data; end if nargin > 1 obj.Description = desc; end obj.Date = clock; end end end
Реализуйте subsref метод, чтобы поддержать и значение по умолчанию и специализированный тип индексации.
Значение по умолчанию индексированное ссылочное поведение для скалярных объектов:
obj.Data(2,3)
ans =
5И добавить функциональность, чтобы индексировать в Data свойство с выражением как этот оператор:
obj(2,3)
Если вы переопределяете '()' индексация к доступу к поддержке к Data свойство, вы не можете создать массивы MyDataClass объекты и использование '()' индексация, чтобы получить доступ к отдельным объектам. Можно сослаться только на скалярные объекты.
Достигнуть целей проекта, subsref метод должен обработать все типы индексации. subsref метод:
Вызывает builtin
subsref функция для '.' индексация
Возвращает ошибку для '{}' индексация
Задает его собственную версию '()' индексация.
Результат: obj(i) эквивалентно obj.Data(i).
function sref = subsref(obj,s) % obj(i) is equivalent to obj.Data(i) switch s(1).type case '.' sref = builtin('subsref',obj,s); case '()' if length(s) < 2 sref = builtin('subsref',obj.Data,s); else sref = builtin('subsref',obj,s); end case '{}' error('MYDataClass:subsref',... 'Not a supported subscripted reference') end end
Чтобы поддержать эквивалент индексируемого ссылочного поведения с индексируемым присвоением, реализуйте subsasgn метод.
Поддержите индексированное присвоение значения по умолчанию:
obj.Data(2,3) = 9;
Добавьте функциональность, чтобы присвоить значения Data свойство с выражением как этот оператор:
obj(2,3) = 9;
Как subsref метод, subsasgn метод:
Вызывает builtin
subsasgn функция для '.' индексация
Возвращает ошибку для '{}' индексация
Задает его собственную версию '()' индексация.
substruct функция переопределяет тип индекса и структуру индексов индекса, которую MATLAB® передает subsref и subsasgn.
function obj = subsasgn(obj,s,val) if isempty(s) && isa(val,'MyDataClass') obj = MyDataClass(val.Data,val.Description); end switch s(1).type case '.' obj = builtin('subsasgn',obj,s,val); case '()' if length(s)<2 if isa(val,'MyDataClass') error('MyDataClass:subsasgn',... 'Object must be scalar') elseif isa(val,'double') % Redefine the struct s to make the call: obj.Data(i) snew = substruct('.','Data','()',s(1).subs(:)); obj = subsasgn(obj,snew,val); end end case '{}' error('MyDataClass:subsasgn',... 'Not a supported subscripted assignment') end end
Во-первых, реализуйте double метод, который преобразует объект в массив типа double. Путем реализации double метод конвертера, возможно добавить MyDataClass возразите против другого класса объекта. Однако другой класс должен реализовать double метод, который также возвращает массив типа double. Для получения дополнительной информации о преобразовании типов см. Преобразователи объектов.
Позвольте прямое сложение Data значения свойств путем реализации plus метод. Реализация plus метод включает использование + оператор для сложения MyDataClass объекты.
Поскольку плюс метод реализует сложение путем добавления двойных массивов, MATLAB:
Примените правила сложения при добавлении MyDataClass объекты
Возвращает ошибки для любого условия, которое может вызвать ошибки в числовом сложении по умолчанию. Например, несоответствие размерности.
plus метод использует double метод, чтобы преобразовать объект в числовые значения прежде, чем выполнить сложение:
function a = double(obj) a = obj.Data; end
function c = plus(obj,b) c = double(obj) + double(b); end
Например, plus метод позволяет вам добавить скалярный номер в объект Data массив.
Вот значения Data, отображенное использование индексированная ссылка:
obj(:,:)
ans =
8 9 3 9
9 6 9 2
2 1 9 9Добавьте 7 к массиву, содержавшемуся в Data свойство:
obj + 7
ans =
15 16 10 16
16 13 16 9
9 8 16 16Это определение для MyDataClass включает end метод индексирования обсужден в конце как Индекс объекта. посторонний
classdef MyDataClass % Example for "A Class with Modified Indexing" properties Data Description end properties (SetAccess = private) Date end methods function obj = MyDataClass(data,desc) % Support 0-2 args if nargin > 0 obj.Data = data; end if nargin > 1 obj.Description = desc; end obj.Date = clock; end function sref = subsref(obj,s) % obj(i) is equivalent to obj.Data(i) switch s(1).type case '.' sref = builtin('subsref',obj,s); case '()' if length(s)<2 sref = builtin('subsref',obj.Data,s); else sref = builtin('subsref',obj,s); end case '{}' error('MyDataClass:subsref',... 'Not a supported subscripted reference') end end function obj = subsasgn(obj,s,val) if isempty(s) && isa(val,'MyDataClass') obj = MyDataClass(val.Data,val.Description); end switch s(1).type case '.' obj = builtin('subsasgn',obj,s,val); case '()' % if length(s)<2 if isa(val,'MyDataClass') error('MyDataClass:subsasgn',... 'Object must be scalar') elseif isa(val,'double') snew = substruct('.','Data','()',s(1).subs(:)); obj = subsasgn(obj,snew,val); end end case '{}' error('MyDataClass:subsasgn',... 'Not a supported subscripted assignment') end end function a = double(obj) a = obj.Data; end function c = plus(obj,b) c = double(obj) + double(b); end function ind = end(obj,k,n) szd = size(obj.Data); if k < n ind = szd(k); else ind = prod(szd(k:end)); end end end end