exponenta event banner

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

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

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

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

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

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

В этой таблице описывается структура данных.

Данные

Описание

Material

char вектор, определяющий тип испытываемого материала

SampleNumber

Номер конкретного тестового образца

Stress

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

Strain

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

Modulus

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

Класс TensableData

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

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

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

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

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.

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

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 собственность. Однако метод set позволяет выдать настраиваемое сообщение об ошибке. Modulus set method ссылается на текущее значение свойства, а затем возвращает ошибку:

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 класс перегружает MATLAB plot функция.

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 при запросе. Сведения об этом коде см. в разделе Расчет данных по требованию.

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

   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 при запросе свойства.

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

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

   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 для отображения определенных свойств.

Дополнительные сведения об этом коде см. в разделе Отображение объектов TensableData

Общие сведения о перегрузке 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.

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

Связанные темы