Представление структурированных данных с классами

Объекты как структуры данных

Этот пример задает класс для того, чтобы хранить данные с определенной структурой. Используя сопоставимую структуру для хранения данных облегчает создавать функции, которые работают с данными. MATLAB® struct с именами полей, описывающими конкретный элемент данных, полезный способ организовать данные. Однако класс может задать и хранение данных (свойства) и операции, которые можно выполнить на тех данных (методы). Этот пример иллюстрирует эти преимущества.

Фон для примера

В данном примере данные представляют растяжимые измерения напряжения/деформации. Эти данные используются, чтобы вычислить эластичный модуль различных материалов. Проще говоря, напряжение является силой, применился к материалу, и деформация является получившейся деформацией. Их отношение задает характеристику материала. В то время как этот подход по упрощению процесса, это достаточно для этого примера.

Структура данных

Эта таблица описывает структуру данных.

Данные

Описание

Material

char вектор, идентифицирующий тип материала, протестирован

SampleNumber

Количество конкретной тестовой выборки

Stress

Вектор чисел, представляющих напряжение, применился к выборке во время теста.

Strain

Вектор чисел, представляющих деформацию в соответствующих значениях прикладного напряжения.

Modulus

Номер, задающий эластичный модуль материала под тестом, который вычисляется из данных о деформации и напряжения

Класс TensileData

Этот пример начинается с простой реализации класса и основывается на этой реализации, чтобы проиллюстрировать, как функции улучшают полноценность класса.

Первая версия класса обеспечивает только хранение данных. Класс задает свойство для каждого из необходимых элементов данных.

classdef TensileData
   properties
      Material
      SampleNumber
      Stress
      Strain
      Modulus
   end
end

Создание экземпляра и присвоение данных

Следующие операторы создают TensileData объект и данные о присвоении к нему:

td = TensileData;
td.Material = 'Carbon Steel';
td.SampleNumber = 001;
td.Stress = [2e4 4e4 6e4 8e4];
td.Strain = [.12 .20 .31 .40];
td.Modulus = mean(td.Stress./td.Strain);

Преимущества Класса по сравнению со Структурой

Обработайте TensileData объект (td в предыдущих операторах), хотя вы были бы любая структура MATLAB. Однако задавая специализированную структуру данных, когда класс имеет преимущества перед использованием структуры данных общего назначения, как struct MATLAB:

  • Пользователи не могут случайно написать имя поля c ошибкой, не получая ошибку. Например, ввод следующего:

    td.Modulis = ...
    

    просто добавило бы поле к структуре. Однако это возвращает ошибку когда td экземпляр TensileData класс.

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

  • Класс легко идентифицировать. Класс имеет имя так, чтобы можно было идентифицировать объекты с whos и class функции и браузер Рабочей области. Имя класса дает возможность относиться к записям с понятным именем.

  • Класс может подтвердить отдельные значения полей, когда присвоено, включая класс или значение.

  • Класс может ограничить доступ к полям, например, позволив конкретному полю быть считанным, но не измененным.

Ограничение свойств заданным значениям

Ограничьте свойства определенными значениями путем определения метода доступа набора свойств. MATLAB вызывает метод доступа набора, устанавливая значение для свойства.

Функция множества материальной собственности

Material метод набора свойств ограничивает присвоение свойства к одной из следующих строк: aluminum, stainless steel, или carbon steel.

Добавьте это функциональное определение блоку методов.

classdef TensileData
   properties
      Material
      SampleNumber
      Stress
      Strain
      Modulus
   end
   methods
      function obj = set.Material(obj,material)
         if (strcmpi(material,'aluminum') ||...
               strcmpi(material,'stainless steel') ||...
               strcmpi(material,'carbon steel'))
            obj.Material = material;
         else
            error('Invalid Material')
         end
      end
   end
end

Когда существует попытка установить Material свойство, MATLAB вызывает set.Material метод прежде, чем установить значение свойства.

Если значение совпадает с приемлемыми значениями, функция установила свойство на то значение. Код в методе установки может получить доступ к свойству непосредственно, чтобы не вызывать метод набора свойств рекурсивно.

Например:

td = TensileData;
td.Material = 'brass';
Error using TensileData/set.Material
Invalid Material

Упрощение интерфейса с конструктором

Упростите интерфейс до TensileData класс путем добавления конструктора, что:

  • Позволяет вам передать данные в качестве аргументов конструктору

  • Значения присвоений к свойствам

Конструктор является методом, имеющим то же имя как класс.

methods
   function td = TensileData(material,samplenum,stress,strain)
      if nargin > 0
         td.Material = material;
         td.SampleNumber = samplenum;
         td.Stress = stress;
         td.Strain = strain;
      end
   end 
end

Создайте TensileData возразите полностью заполненный с данными с помощью следующего оператора:

td = TensileData('carbon steel',1,...
      [2e4 4e4 6e4 8e4],...
      [.12 .20 .31 .40]);

Вычисление данных по требованию

Если значение свойства зависит от значений других свойств, задайте то свойство с помощью Dependent атрибут. MATLAB не хранит значения зависимых свойств. Зависимое свойство добирается, метод определяет значение свойства, когда к свойству получают доступ. Доступ может произойти при отображении свойств объектов или как результата явного запроса.

Вычисление модуля

TensileData объекты не хранят значение Modulus свойство. У конструктора нет входного параметра для значения Modulus свойство. Значение Modulus:

  • Вычисляется от Stress и Strain значения свойств

  • Должен измениться если значение Stress или Strain изменения свойства

Поэтому лучше вычислить значение Modulus свойство только, когда его значение требуют. Используйте свойство get метод доступа, чтобы вычислить значение Modulus.

Свойство модуля метод get

Modulus свойство зависит от Stress и Strain, так его Dependent атрибутом является true. Поместите Modulus свойство в отдельном properties блокируйте и установите Dependent атрибут.

get.Modulus метод вычисляет и возвращает значение Modulus свойство.

properties (Dependent)
   Modulus
end

Задайте свойство, получают метод в methods блокируйте использование только атрибуты по умолчанию.

methods
   function modulus = get.Modulus(obj)
      ind = find(obj.Strain > 0);
      modulus = mean(obj.Stress(ind)./obj.Strain(ind));
   end
end

Этот метод вычисляет среднее отношение напряжения, чтобы напрячь данные после устранения нулей в данных о знаменателе.

MATLAB вызывает get.Modulus метод, когда свойство запрошено. Например,

td = TensileData('carbon steel',1,...
      [2e4 4e4 6e4 8e4],...
      [.12 .20 .31 .40]);
td.Modulus
ans =
  1.9005e+005

Метод набора свойств модуля

Устанавливать значение Dependent свойство, класс должен реализовать метод набора свойств. Нет никакой потребности позволить явную установку Modulus свойство. Однако метод установки позволяет вам предоставить индивидуально настраиваемое сообщение об ошибке. Modulus метод установки ссылается на текущее значение свойства и затем возвращает ошибку:

methods
   function obj = set.Modulus(obj,~)
      fprintf('%s%d\n','Modulus is: ',obj.Modulus)
      error('You cannot set the Modulus property');
   end
end

Отображение TensileData Объекты

TensileData класс перегружает disp метод. Этот метод управляет отображением объекта в командном окне.

disp метод отображает значение Material, SampleNumber, и Modulus свойства. Это не отображает Stress и Strain данные о свойстве. Эти свойства содержат необработанные данные, который легко не просматривается в командном окне.

disp метод использует fprintf отобразить форматированный текст в командном окне:

methods
   function disp(td)
      fprintf(1,...
         'Material: %s\nSample Number: %g\nModulus: %1.5g\n',...
         td.Material,td.SampleNumber,td.Modulus);
   end 
end

Метод, чтобы построить график напряжения по сравнению с деформацией

Полезно просмотреть график данных о напряжении/деформации, чтобы определить поведение материала в области значений прикладной силы. TensileData класс перегружает plot MATLAB функция.

plot метод создает линейный график напряжения по сравнению с данными о деформации и добавляет заголовок и подписи по осям, чтобы произвести стандартизированный график для растяжимых записей данных:

methods
   function plot(td,varargin)
      plot(td.Strain,td.Stress,varargin{:})
      title(['Stress/Strain plot for Sample',...
         num2str(td.SampleNumber)])
      ylabel('Stress (psi)')
      xlabel('Strain %')
   end 
end

Первым аргументом к этому методу является TensileData объект, который содержит данные.

Метод передает список переменных аргументов (varargin) непосредственно к встроенному plot функция. TensileData plot метод позволяет вам передавать аргументы спецификатора линии или пары "имя-значение" свойства.

Например:

td = TensileData('carbon steel',1,...
      [2e4 4e4 6e4 8e4],[.12 .20 .31 .40]);
plot(td,'-+b','LineWidth',2)

TensileData Резюме класса

Пример кодаОбсуждение
classdef TensileData

Класс значения включает независимые копии объекта. Для получения дополнительной информации смотрите Сравнение Классов Указателя и Значения

   properties
      Material
      SampleNumber
      Stress
      Strain
   end

Смотрите структуру данных

   properties (Dependent)
      Modulus
   end 

Вычислите Modulus когда запрошено. Для получения информации об этом коде смотрите, Вычисляют Данные по требованию.

Для получения общей информации смотрите Набор и методы get для Dependent Properties

   methods

Для получения общей информации о методах, см. Обычные Методы

   function td = TensileData(material,samplenum,...
      stress,strain)
      if nargin > 0
         td.Material = material;
         td.SampleNumber = samplenum;
         td.Stress = stress;
         td.Strain = strain;
      end
   end

Для получения информации об этом коде смотрите Упрощение Интерфейса с Конструктором.

Для получения общей информации о конструкторах, см. Методы Конструктора класса

   function obj = set.Material(obj,material)
      if (strcmpi(material,'aluminum') ||...
         strcmpi(material,'stainless steel') ||...
         strcmpi(material,'carbon steel'))
         obj.Material = material;
      else
         error('Invalid Material')
      end
   end

Ограничьте возможные значения для Material свойство.

Для получения информации об этом коде смотрите Restrict Properties к Определенным Значениям.

Для получения общей информации о методах набора свойств, см. Методы Набора свойств.

   function m = get.Modulus(obj)
      ind = find(obj.Strain > 0); 
      m = mean(obj.Stress(ind)./obj.Strain(ind)); 
   end 

Вычислите Modulus свойство, когда запрошено.

Для получения информации об этом коде смотрите Свойство Модуля метод get.

Для получения общей информации о свойстве получите методы, смотрите Свойство методы get.

   function obj = set.Modulus(obj,~)
      fprintf('%s%d\n','Modulus is: ',obj.Modulus)
      error('You cannot set Modulus property'); 
   end 

Добавьте метод установки для Dependent Modulus свойство. Для получения информации об этом коде см. Метод Набора свойств Модуля.

Для получения общей информации о методах набора свойств, см. Методы Набора свойств.

   function disp(td)
      fprintf(1,'Material: %s\nSample Number: %g\nModulus: %1.5g\n',...
      td.Material,td.SampleNumber,td.Modulus)
   end 

Перегрузка disp метод, чтобы отобразить определенные свойства.

Для получения информации об этом коде смотрите Отображающиеся Объекты TensileData

Для получения общей информации о перегрузке disp, смотрите Перегрузку функции disp

   function plot(td,varargin)
      plot(td.Strain,td.Stress,varargin{:})
      title(['Stress/Strain plot for Sample',...
         num2str(td.SampleNumber)])
      ylabel('Stress (psi)')
      xlabel('Strain %')
   end 

Перегрузка plot функция, чтобы принять TensileData объекты и график подчеркивают по сравнению с деформацией.

Метод, чтобы построить график напряжения по сравнению с деформацией

   end
end

end операторы для methods и для classdef.

 Расширьтесь для кода класса

Похожие темы