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

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

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

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

    td.Modulis = ...
    

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

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

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

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

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

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

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

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

The 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 метод перед установкой значения свойства.

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

Для примера:

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.

Метод получения свойств модуля

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

The 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

Метод набора свойств Modulus

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

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

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

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

The disp метод отображает значение Material, SampleNumber, и Modulus свойства. Он не отображает Stress и Strain данные о свойствах. Эти свойства содержат необработанные данные, которые трудно просмотреть в командном окне.

The 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

Метод построения графика напряжения и деформации

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

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

Для примера:

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

TensileData Обобщение классов

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

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

   properties
      Material
      SampleNumber
      Stress
      Strain
   end

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

   properties (Dependent)
      Modulus
   end 

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

Для получения общей информации смотрите Задать и получить методы для зависимых свойств

   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 свойство.

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

Общие сведения о методах набора свойств см. в разделе Методы набора свойств.

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

Вычислите Modulus свойство при запросе.

Для получения информации об этом коде смотрите Modulus Property Get Method.

Общие сведения о методах получения свойств см. в разделе Методы получения свойств.

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

Добавьте метод set для Dependent Modulus свойство. Для получения информации об этом коде смотрите Метод набора свойств 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

   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.

 Разверните для кода класса

Похожие темы