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

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

Этот пример задает класс для того, чтобы хранить данные с определенной структурой. Используя сопоставимую структуру для хранения данных облегчает создавать функции, которые работают с данными. 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:

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

  • Должен измениться, если значение свойства 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. Метод plot TensileData позволяет вам передавать аргументы спецификатора строки или пары "имя-значение" свойства.

Например:

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.

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

Похожие темы